zahlzuziffer
-
Abend
könnte mir jemand diese Aufgabenstellung erklären..
verstehe nicht, was von mir verlangt wird..Implementieren Sie eine Funktion char ZahlzuZiffer(int z, int b), die zu einer Zahl z < b das z-te Symbol der Folge ’0’,’1’,’2’,...,’9’,’A’,’B’,’C’,...,’Z’ zurückgibt. Ist z größer als b oder ist b größer als unser Zeichenvorrat (36), so soll ’x’ zurückgegeben werden.
-
Ist nicht lösbar, weil unterspezifiziert. Was, wenn z = b? Oder z < 0? Beginnen Folgen bei 0 oder 1?
-
Es gibt verschiedene Ansätze.
Bei einem solltest du dich mal mit ASCII befassen.
Bei einem weitern solltest du Arrays kennen.
-
mark93666 schrieb:
Abend
könnte mir jemand diese Aufgabenstellung erklären..
verstehe nicht, was von mir verlangt wird..Implementieren Sie eine Funktion char ZahlzuZiffer(int z, int b), die zu einer Zahl z < b das z-te Symbol der Folge ’0’,’1’,’2’,...,’9’,’A’,’B’,’C’,...,’Z’ zurückgibt. Ist z größer als b oder ist b größer als unser Zeichenvorrat (36), so soll ’x’ zurückgegeben werden.
Du solltest keinen tieferen Sinn in der Aufgabe suchen, es geht einfach darum, dass du Kontrollstrukturen und Programmablauf verstehen und umsetzen kannst. Anhand einer Aufgabe, die du so garantiert nirgendwo gelöst im Internet finden kannst. Lies die Beschreibung mal ganz konzentriert durch, dann sollte klar werden, was verlangt wird. Ich gebe mal ein paar Beispiele:
ZahlzuZiffer(0, 25) -> '0'
ZahlzuZiffer(10, 56) -> 'x'
ZahlzuZiffer(10, 11) -> 'A'
ZahlzuZiffer(10, 9) -> 'x'
ZahlzuZiffer(33, 10) -> 'x'
ZahlzuZiffer(33, 35) -> 'Y'Dummerweise ist die Aufgabe undefiniert für den Fall z == b und/oder z < 0. Fehler in der Aufgabe oder Anregung zum Mitdenken?
-
Holtrio mark93666!
Hier mal ein Vorschlag, den könnte man eventuell noch verfeinern:
//Implementieren Sie eine Funktion char ZahlzuZiffer(int z, int b), // die zu einer Zahl z < b das z-te Symbol der Folge ’0’,’1’,’2’,...,’9’,’A’,’B’,’C’,...,’Z’ zurückgibt. //Ist z größer als b oder ist b größer als unser Zeichenvorrat (36), so soll ’x’ zurückgegeben werden. #include <stdio.h> // = ist ASCII Nr.: 48 ist '0' ASCII 57='9' // 'A'= 65, 'Z'= 90 char ZahlzuZiffer(int z, int b) { char letter = 'x'; if ((z < b ) && (b <= 36)) { if ((z >= 0) && (z <= 9)) letter = (char)(z + 48); if ((z >= 10) && (z <= 36)) letter = (char)z + 55; } return letter; } int main() { int z, b; b = 36; printf("Zahl zu Ziffer\n"); for (z = 0; z <= 36; z++) printf ("z=%d b=%d Ziffer= %c\n", z , b, ZahlzuZiffer(z, b)); return 0; }
Hier eine Liste der Bedeutung der ASCII-Zeichen von 0 bis 32 als Steuerzeichen für Datenübertragung, Drucker, Bildschirmsteuerzeichen, usw.: 00 NULL, no Operation, ..........NUL keine Operation 01 Start of Heading .............SOH Vorspannanfang 02 Start of Text ................STX Textanfang 03 End of Text ..................ETX Textende 04 End of Transmission ..........EOT Übertragungsende 05 Enquiry ......................ENQ Stationsanruf 06 Acknowledge ..................ACK Bestätigung 07 Bell..........................BEL Klingel 08 Backspace.....................BS Rückwärtsschritt 09 HAT...........................Horizontal Tabulation 10 Line Feed.................... LF Zeilenvorschub 11 Vertical Tabulation VT 12 Form Feed FF..................Formularvorschub, Schirmlöschen 13 Carrige Return ...............CR Wagenrücklauf 14 Shift out ....................SO Umschalten aus 15 Shift in .....................SI Umschalten ein 16 Data Link Escape..............DLE Austritt aus der Datenverbindung 17 Device Control 1..............DC1 Gerätesteuerung 1 18 Device Control 2..............DC2 Gerätesteuerung 2 19 Device Control 3..............DC3 Gerätesteuerung 3 20 Device Control 4..............DC4 Gerätesteuerung 4 21 Negative Acknowledge .........NAK Fehlermeldung 22 Synchronous Idle .............SYN Synchronisierung 23 End of Transm.Block...........ETB Datenblockende 24 Cancel .......................CAN ungültig 25 End of Medium ................EM Datenträgerende 26 Substitute ...................SUB Character Zeichen ersetzen 27 Escape........................ESC Rücksprung 28 File Separator................FS Filetrennung 29 Group Separator...............GS Gruppentrennung 30 Record Separator .............RS Untergruppentrennung 31 Unit Separator ...............US Einheitentrennung 32 Space ........................SP Leerschritt
Die restlichen Zeichen von 33 bis 127 zeigt folgendes
Mini-Programm an:/* A33to127.c * Zeigt die ASCII-Zeichen 33 bis 127 an */ #include <stdio.h> #include <stdlib.h> int main() { int i, b, c, d, e, f; printf("ASCII 33 bis 127\n"); for ( i = 1; i <= 19; i++) { b = i + 32; printf("\n%3d %c",b,b ); c = i + 51; printf(" %3d %c",c,c ); d = i + 70; printf(" %3d %c",d,d ); e = i + 89; printf(" %3d %c",e,e ); f = i + 108; printf(" %3d %c",f,f ); } return 0; }
-
char ZahlzuZiffer(int z, int b) { char *ziffern="0123456789abcdefghijklmnopqrstuvwxyz"; if(z>=b || b>strlen(ziffern) ) return 'X' else return ziffern[z]; }
ungetestet
Verwende keine Magic Numbers.
Wenn man mit 48 das Zeichen '0' meint, dann schreibt man auch einfach '0' .
Und statt 55 dann 'A'-10.
-
DirkB schrieb:
Verwende keine Magic Numbers
Ox37 ist '7' und das ist auch gut so.
-
Das ist ASCII und Verwandte.
-
Hi!
Dein Vorschlag ist besser!, warum sollte man mehr als 36 Zeichen implemeniteren wollen? Die Lösung mit dem Array bietet später die Möglichkeit zur Umwandlung
von Zahl zu Ziffer bei verschiedenen Zahlensystemen. Bei direkter Ansprache wird
so was viel zu kompliziert. Ist wahrscheinlich die nächste Aufgabe, die wartet.