Seite 1 von 1
Formatierung
Verfasst: Donnerstag 23. Januar 2020, 02:35
von 3.1415926
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

Danke im Voraus!
MfG
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 11:15
von sparrow
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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 11:54
von __blackjack__
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
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 14:45
von 3.1415926
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()
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 14:51
von __blackjack__
@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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:16
von 3.1415926
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:
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
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:28
von EyDu
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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:35
von 3.1415926
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
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:53
von /me
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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:57
von __blackjack__
@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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 15:59
von /me
Ich würde einfach die `isprintable` Methode eines Strings verwenden um festzustellen ob ich das Zeichen oder einen Ersatz (z.B. ein Leerzeichen) ausgebe.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 16:03
von 3.1415926
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
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 16:13
von sparrow
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.
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 17:21
von __blackjack__
@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
Re: Formatierung
Verfasst: Donnerstag 23. Januar 2020, 17:51
von Sirius3
@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.
Re: Formatierung
Verfasst: Freitag 24. Januar 2020, 18:52
von 3.1415926
Hallo,
Vielen Dank für eure HIlfe!
Ich musste doch erst heute abgeben

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
Re: Formatierung
Verfasst: Samstag 25. Januar 2020, 00:50
von __blackjack__
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