Formatierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Hallo liebes Forum.
Ich habe eine Frage bzgl. einer Hausaufgabe.

Die Angabe lautet wie folgt:
Erstelle eine ASCII Tabelle -> in der ersten Spalte links stehen die Zahlen von 0 - 240 in 20er Schritten. Über der Tabelle in der ersten Zeile steht 0 - 19.

Ich hoffe ihr könnt euch was drunter vorstellen.

Eigentlich haut auch alles hin, verschachtelte for Schleifen, umwandeln mit chr... Alles kein Problem.
Nur weiß ich leider nicht, wie ich das ganze in Tabellenform bekommen.
Also es geht mir rein um die Formatierung.
Eigentlich würde ich, wenn ich die Aufgabe nicht grad morgen abgeben müsste, selber recherchieren... Mein Zeitmanagment halt :roll:
Danke im Voraus!
MfG
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Dann zeig doch mal wie dein Code bisher aussieht.
Eigentlich sind das ja nur 2 verschachtelte for-Schleifen. Und die hast du ja bereits erwähn.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die `format()`-Methode auf Zeichenketten und da die ”Minisprache” für die Formatspezifikation sollte man noch kennen, um beispielsweise Platzhalter die in Zeichenketten formatiert werden auf eine bestimmte Breite aufzufüllen. Das steht alles, samt Beispielen, in der Dokumentation vom `string`-Modul in der Standardbibliothek.

Edit: Bis 240 ist viel zu weit. ASCII geht nur bis 127. Was soll denn nach 127 in der Tabelle angezeigt werden? Auszug aus der Linux ASCII Manpage:

Code: Alles auswählen

          2 3 4 5 6 7       30 40 50 60 70 80 90 100 110 120
        -------------      ---------------------------------
       0:   0 @ P ` p     0:    (  2  <  F  P  Z  d   n   x
       1: ! 1 A Q a q     1:    )  3  =  G  Q  [  e   o   y
       2: " 2 B R b r     2:    *  4  >  H  R  \  f   p   z
       3: # 3 C S c s     3: !  +  5  ?  I  S  ]  g   q   {
       4: $ 4 D T d t     4: "  ,  6  @  J  T  ^  h   r   |
       5: % 5 E U e u     5: #  -  7  A  K  U  _  i   s   }
       6: & 6 F V f v     6: $  .  8  B  L  V  `  j   t   ~
       7: ' 7 G W g w     7: %  /  9  C  M  W  a  k   u  DEL
       8: ( 8 H X h x     8: &  0  :  D  N  X  b  l   v
       9: ) 9 I Y i y     9: '  1  ;  E  O  Y  c  m   w
       A: * : J Z j z
       B: + ; K [ k {
       C: , < L \ l |
       D: - = M ] m }
       E: . > N ^ n ~
       F: / ? O _ o DEL
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Hallo, danke für euer Antworten! Die Formatierung habe ich jetzt schon hinbekomen.. Das ist mein Code momentan. Danke!
Nur kommen irgendwie nicht ganz die richtigen Zeichen... Vielleicht könnt ihr mir da noch ein paar Tipps geben.
MfG

Code: Alles auswählen

print("      ", end="")
for z in range(20):
    print("{:2d}".format(z), end =  ' ')

print("*"*66)
for i in range(0, 241, 20):
    print("{:3d} * ".format(i), end =  ' ')
    for x in range(0, 20):
        a = x + i
        b = chr(a)
        if a >= 32:
            print("{:2s}".format(b), end = ' ')
    print()
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@3.1415926: Was heisst „nicht ganz die richtigen Zeichen“? Was kommt dabei heraus, und an welcher Stelle unterscheidet sich das von dem was Du erwartest?

Edit: Und ich erwähne hier gerne noch einmal das ASCII nur bis 127 geht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Ich kann grade leider kein Foto posten.
Dass ASCII nur bis 127 geht verirrt mich jetzt...
Die Angabe lautet:
Schreibe ein Programm, das eine ASCII Code Tabelle für die druckbaren Zeichen(ASCII-Codes von 32- 255).
Aber laut dem hier geht die Tabelle schon bis 255:
Bild

Das kommt bei mir raus:

Code: Alles auswählen

       0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
  0 *  
 20 *     !  "  #  $  %  &  '  
 40 *  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  
 60 *  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  
 80 *  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  
100 *  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  
120 *  x  y  z  {  |  }  ~    €    ‚  ƒ  „  …  †  ‡  ˆ  ‰  Š  ‹  
140 *  Œ    Ž      ‘  ’  “  ”  •  –  —  ˜  ™  š  ›  œ    ž  Ÿ  
160 *     ¡  ¢  £  ¤  ¥  ¦  §  ¨  ©  ª  «  ¬  ­  ®  ¯  °  ±  ²  ³  
180 *  ´  µ  ¶  ·  ¸  ¹  º  »  ¼  ½  ¾  ¿  À  Á  Â  Ã  Ä  Å  Æ  Ç  
200 *  È  É  Ê  Ë  Ì  Í  Î  Ï  Ð  Ñ  Ò  Ó  Ô  Õ  Ö  ×  Ø  Ù  Ú  Û  
220 *  Ü  Ý  Þ  ß  à  á  â  ã  ä  å  æ  ç  è  é  ê  ë  ì  í  î  ï  
240 *  ð  ñ  ò  ó  ô  õ  ö  ÷  ø  ù  ú  û  ü  ý  þ  ÿ  Ā  ā  Ă  ă 
MfG
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

3.1415926 hat geschrieben: Donnerstag 23. Januar 2020, 15:16 Dass ASCII nur bis 127 geht verirrt mich jetzt...
Die Angabe lautet:
Schreibe ein Programm, das eine ASCII Code Tabelle für die druckbaren Zeichen(ASCII-Codes von 32- 255).
Naja, da ist die Aufgabe ungenau/falsch. Wahrscheinlich ist ISO-8859 gemeint.
Das Leben ist wie ein Tennisball.
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Also das in der Angabe ist eine ASCII Tabelle, genau wie die ich gepostet habe.
Und wenn ich chr() auf Zahlen anwende, kommt das Richtig raus.
In meinem Code jedoch nicht ?
Mfg
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

3.1415926 hat geschrieben: Donnerstag 23. Januar 2020, 15:35 Also das in der Angabe ist eine ASCII Tabelle, genau wie die ich gepostet habe.
Und wenn ich chr() auf Zahlen anwende, kommt das Richtig raus.
In meinem Code jedoch nicht ?
Was, wie bereits gesagt, daran liegt, dass ASCII-Zeichen nur bis 127 definiert sind. Mehr geht auch nicht, da ASCII ein 7-bit-Code ist. Alles andere sind hersteller- bzw. länderspezifische Erweiterungen. Dein Besipiel könnte Codepage 850 sein.
Zuletzt geändert von /me am Donnerstag 23. Januar 2020, 15:58, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@3.1415926: Nein, das was Du da gepostet hast ist *keine* ASCII-Tabelle. ASCII hat nur Werte bis 127. Schreibe ich jetzt zum dritten mal. In der Tabelle ist auch nicht ISO-8859. Wo hast Du die Grafik denn her?

Hier ist ASCII beschrieben: https://de.wikipedia.org/wiki/American_ ... nterchange

Ich würde da einfach ab 128 das gleiche machen wie bei Codes innerhalb des 0...127 Bereichs die kein darstellbares Zeichen kodieren. Also weg lassen oder ein Leerzeichen oder einen Punkt ausgeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich würde einfach die `isprintable` Methode eines Strings verwenden um festzustellen ob ich das Zeichen oder einen Ersatz (z.B. ein Leerzeichen) ausgebe.
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Ok, was muss ich also tun, damit ich eine Tabelle wie die von mir gepostete bekommen ? Selber komme ich leider nicht weiter. Ich will auch eher drauf hinaus, dass ich Zahlen problemlos mit Python in das geforderte Zeichen umwandeln kann (mit chr()) - also wenn ich chr(254) mache, bekomme ich was oben in der Tabelle bei 254 steht. Jedoch in meinem Programm funktioniert das leider nicht.
Gefunden habe ich die Tabelle einfach unter ASCII.
Tut mir leid, falls ich blöde Fragen stelle...
MfG
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Dein Programm funktioniert absolut korrekt.
Der von dir verwendete Zeichensatz beinhaltet an der Position der Codetabelle das entsprechende Zeichen.

Wenn du als Ergebnis die Tabelle haben möchtest, die du oben gezeigt hast, musst herausfinden welche Codepage dort dargestellt wird, diese in deinem System einstellen und das Programm dann laufen lassen.
Das macht allerdings keinen Sinn.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sparrow: Das ist keine Frage der eingestellten Codepage. `chr()` wandelt einen Unicode-Codepoint in ein Unicode-Zeichen um. Das ist eindeutig und unabhängig vom Betriebssystem und dessen Einstellungen.

Wenn man eine bestimmte Codepage darstellen möchte, müsste man ein Bytearray mit aufsteigenden Werten dekodieren, eventuell mit "replace" als `errors`-Argument und dann für die Anzeige auch noch mal extra auf das „replacement character“-Zeichen (�) prüfen und reagieren. Dann gibt es drei Fälle: darstellbares Zeichen, nicht darstellbares Zeichen, und in der Codepage nicht zugeordneter Bytewert. Ohne Farbe oder irgendeine andere Markierung wird es dann langsam nicht mehr so eindeutig das in einer Tabelle darzustellen. :-)

@3.1415926: Noch mal: Die Tabelle ist falsch beschriftet, das ist *keine ASCII-Tabelle* in dem Bild. Vergiss das Bild! Das ist falsch. Das Bild ist nicht korrekt. Lies den Wikipediaartikel zu ASCII.

Wenn Du eine ASCII-Tabelle ausgeben sollst, dann gib nur die Zeichen für Werte bis 127 aus, denn nur die sind in ASCII definiert. Wobei 127 selbst zwar in ASCII definiert ist, aber wie die Zeichenwerte <32 kein darstellbares Zeichen kodiert. Also entweder auch explizit weg lassen, oder wie /me vorgeschlagen hat nicht darstellbare Zeichen durch ein Leerzeichen oder irgend etwas anderes darstellen. Ein Punkt ist auch nicht unüblich um nicht darstellbare Zeichencodes anzuzeigen. Und Du solltest da explizit etwas anzeigen weil das Terminal sonst komische Sachen macht, also entweder das irgendwie als Steuerzeichen interpretiert, oder *nichts* anzeigt, was in beiden Fällen das Layout der Tabelle stören kann.

Die Tabelle sieht auch für eine Codepage komisch aus IMHO. Mich würde da ja wirklich mal die Quelle interessieren.

Edit: Nachtrag, das sieht nach der DOS Codepage 850 aus: https://en.wikipedia.org/wiki/Code_page_850
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@3.1415926: Deine Tabelle geht auch bis 259. Das ist also in 8bit auch nicht mehr abbildbar. Sollst Du die ersten 260 Zeichen des Unicode-Zeichensatzes abbilden?
i, x, a und b sind schlechte Variablennamen, weil sie nichts aussagen. Da erwarte ich sowas wie row, column und code_point. Die Zeile "20" ist falsch.
3.1415926
User
Beiträge: 6
Registriert: Donnerstag 23. Januar 2020, 02:04

Hallo,
Vielen Dank für eure HIlfe!
Ich musste doch erst heute abgeben :D
Scheinbar war die Angabe einfach fehlerhaft - ich hab mit einem anderen Lehrer darüber gesprochen, laut ihm stammt die Aufgabe aus C.
Und dass Python da irgendwie anders ist,.... ich habs mir leider nicht genau gemerkt.
Das mit den Variablennamen stimmt, in der Eile hab ich nicht mal an Kommentare gedacht...
Danke nochmal
MfG
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

ASCII ist ein Standard der unabhängig von Programmiersprachen ist. Auch in C hat ASCII nur 7 Bits pro Zeichen und Werte über 127 sind keine ASCII-Zeichen.

In C würde ein entsprechendes Programm beispielsweise so aussehen, welches für jedes darstellbare ASCII-Zeichen das Zeichen und jedes Zeichen ausserhalb von ASCII und/oder das nicht darstellbar ist, einen Punkt ausgibt:

Code: Alles auswählen

#include <ctype.h>
#include <stdio.h>

#define CHARACTERS_PER_ROW  20

int main(void)
{
    int i, c;
    
    printf("   ");
    for (i = 0; i < CHARACTERS_PER_ROW; ++i) printf("%3d", i);
    
    for (c = 0; c < 256; ++c) {
        if (c % CHARACTERS_PER_ROW == 0) printf("\n%3d", c);
        printf("  %c", (isascii(c) && isprint(c)) ? c : '.');
    }
    putchar('\n');
    
    return 0;
}
Ausgabe:

Code: Alles auswählen

     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
  0  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
 20  .  .  .  .  .  .  .  .  .  .  .  .     !  "  #  $  %  &  '
 40  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;
 60  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
 80  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c
100  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w
120  x  y  z  {  |  }  ~  .  .  .  .  .  .  .  .  .  .  .  .  .
140  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
160  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
180  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
200  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
220  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
240  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Das kann man in Python sehr ähnlich lösen. Die `isprint()`-Funktion aus C ist in Python die hier im Thema bereits erwähnte `isprintable()`-Methode. Ein Äquivalent zu `isascii()` gibt es nicht, aber die Unicode-Codepoints 0 bis 127 entsprechen genau den ASCII-Werten: http://www.unicode.org/charts/PDF/U0000.pdf

Damit kann man sich also eine `is_ascii()`-Funktion sehr einfach selbst schreiben:

Code: Alles auswählen

def is_ascii(character):
    return 0 <= ord(character) <= 127
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten