OKTALZAHL.CPP
-
Hallo....
ich habe folgende Hausaufgabe bekommen, aber ich komm irgendwie nicht richtig klar mit ihr...
===============================================================================
1. Schreiben Sie ein Programm OKTALZAHL.CPP, welches vom Benutzer eine dreistellige Oktalzahl entgegennimmt und diese in das Unix/Linux Dateirechte-Format rwx umwandelt und danach auf der Konsole ausgibt. Diese Zahl repräsentiert die Benutzerrechte unter Unix/Linux in der Form -rwxrwxrwx (Eigentümer, Gruppe, Welt).
(Hinweis: dies ist eine abgewandelte alte Prüfungsaufgabe)Ein Beispiel:
Geben Sie die dreistellige Oktalzahl ein: 744
Die entsprechende Dateirechte Maske lautet: -rwxr--r--Geben Sie die dreistellige Oktalzahl ein: 640
Die entsprechende Dateirechte Maske lautet: -rw-r-----Ich weiss... Ihr seid nicht dafuer da meine Hausaufgaben zu machen, aber wenn mir jemand das mit dem umrechnen erklaeren koennten, dann waer ich schon mehr als wie dankbar. Dankeschoen schonmal im vorraus.
Lg
CuPI
-
kein BCB-Spezifisches Problem -> Verschoben nach Rund um...
-
Schau dir die Aufgabe nochmal mit folgenden (ev. neuen) erkenntnissen an:
Oktalzahlen sind 3-Bit-Zahlen (0-7)
Du darfst 3 Oktalzahlen einlesen
Du musst in 3 verschiedenen Kategorien Rechte setzen
Du musst in jeder Kategorie 3 verschiedene Rechte setzenBetrachte mal bei den Beispielen jede einzelne Ziffer als einzelne Zahl und wandle sie nach binär. Anschliessend vergleiche das Bitmuster mit den Rechten. Was fällt auf?
-junix
-
Am besten machst Du Dir erst mal ne Subroutine, die Dir eine einzige Zahl in die Maske 'rwx' umwandelt. Diese Routine rufst Du dann in einer Schelife auf und übergibst ihr jeweils eine Ziffer aus z.B. '744'. Die daraus resultierenden Masken 'rwx' baust Du dann zu einem String zusammen.
In der Routine untersuchst Du die ersten 3 Bits einer Ziffer. In binär sieht eine 7 so aus '111' und ne 4 so '100'. Von rechts nach links betrachtet steht eine '0' für nen '-' und ne '1' für 'x', 'w' oder 'r'. Maskieren geht mit '&'.
Also wenn Du eine Ziffer, z.B. 5 ('101') mit 2 ('010') "und verknüpfts" kommt ne 1 raus sofern das 2.Bit gesetzt ist, in diesem Beispiel natürlich 0.
Probier mal ob Du daraus was machen kannst. Probieren geht über Studieren@junix Hee, Du hast mir den Thread unterm Hintern weggezogen :D:D:D
Ein Glück gibts den Copy und die Paste
-
Original erstellt von Peter:
@junix Hee, Du hast mir den Thread unterm Hintern weggezogen :D:D:D
Ein Glück gibts den Copy und die Paste*hehe* c'est la vie würd ich sagen (o; Dafür hast du mir wieder dazwischen gefunkt (o; Dabei hab ich ihn extra fairnesshalber verschoben und erst dann die Antwort konstruiert (o;
-junix
-
... wo ich doch grad so schreibwütig war
Jedenfalls gibts jetzt 2 Hilfestellungen auf das Problemchen. Jetzt dürfte es doch kein Thema mehr sein, oder Cupdiffusor ?
-
Hey... das waren ja super schnelle Antworten. Vielen Dank... So halb hab ich es jetzt mal verstanden wie es funktionieren sollte. In meiner Mittagspause mach ich mich sofort mal an die Aufgabe ran... *g*
-
Hey Ihr.... ich moechte mich nochmal fuer eure Hilfe wegen der Dateirechte bedanken. Also das mit den Binärzahlen ins rwx format umrechnen versteh ich mal. Nun komm ich aber leider trotzdem nicht weiter.
Gehen wir mal davon aus, die eingegebene Zahl ist
444 in Binärzahl waere es ja dann 100100100
aber wie kann ich die 444 mit C++ umwandeln in Binär??
Gibt es da eine Formel?? Oder muss ich mir da eine eigene Funktion schreiben? Es waere super, wenn mit vielleicht jemand ein Codebeispiel fuer die erste Zahl schreiben koennte, weil sonst komm ich leider auf keinen gruenen Zweig :o
-
Bitmasken sind dir ein Begriff? Wenn nicht, sags, dann werd ich eine etwas längere Abhandlung darüber schreiben (o:
Schau dir mal den Operator & (als Bitweisen Operator) an. Damit kann man ganz Einfach logische AND-Verknüpfungen bauen.
-junix
-
Und beachte mein Geschreibsel, vor allem den ersten Satz. Ich denke mal, dann tust Du Dir viel leicher.
-
Stimmt Peter hat ja eigentlich bereits darüber geschrieben wie die maskiererei funktioniert (o:
Vielleicht noch ergänzend: Wenn du die Maske als Variable gestaltest, kannst du bequem und elegant mittels "shiften" (schieben) der Bits (<< ) die Maske aktualisieren. (o:
-junix
-
Ich schaem mich schon langsam zu fragen...
Also Bitmasken waeren also z.B. folgende
ios::out Schreibmodus (Default für ofstream)
ios::app Append -- Anhängemodus, Schreiben an das Dateiende
ios::ate AtEnd -- automatische Positionierung an das Dateiende
ios::binary Binärmodusund ich muesste mich dann auf die binary beziehen, aber ich habs leider
immer noch nicht ganz verstanden. Irgendwie ist es nicht so ganz mein
LieblingsfachEin kleiner Denkanstoss oder besser gesagt noch ne kleine Hilfe waere super
mega nett von euch
-
Original erstellt von Cupdiffusor:
Also Bitmasken waeren also z.B. folgendeääääh nein.
Kleine Theorie über das Maskieren
Maskieren (im programmiertechnischen Sinne) hat grundätzlich nichts mit Karneval zu tun. Soviel leuchtet glaub ich jedem ein (o: Maskieren nennt man das Ausblenden bestimmter Bits aus einem Binärhaufen.Beispiel
Wenn ich einen Wert habe wie zum Beispiel 0x05 (Bin: 0000 0101) und ich will sehen ob das 1-Wertige Bit gesetzt ist, dann stört mich das 4-Wertige Bit doch etwas. Hier kann man sich eben mit binären Operationen behelfen.
Wenn wir folgende Rechnung ausführen, sind wir alle Bits bis auf das, das wir prüfen wollten los:0000 0101 (bin. AND) & 0000 0001 ----------- 0000 0001
Wäre das 1-Wertige Bit nicht gesetzt, wäre das Ergebnis null.
Schön und gut, aber wie wende ich das jetzt an?
Wenn du die Werte die du überprüfen musst nun einliest, und alle Bits bis auf das das dich interessierst ausblendest, dann gibt es 2 Möglichkeiten wie das Resultat ausfällt: Entweder das Ergebnis ist 0 (Bit war nicht gesetzt, die anderen wurden fürs Ergebnis gelöscht, also 0) oder das Ergebnis ist n (abhängig von der Wertigkeit des Bits). Man kann also in einer if-Anweisung bequem überprüfen ob das Bit gesetzt ist oder nicht.-junix
-
Was ich vergass: deine eingangszahl musst du eben Ziffer für Ziffer von string nach int (oder char) wandeln um das machen zu können. (Wie ich es oben schon erwähnt hatte).
Ahja und Nachfragen ist kein Grund sich zu schämen. Schämen sollte man sich erst ab dem punkt ab dem man nur noch nach "kann jemand bitte die Lösung posten?" fragt (o:
Wenn etwas unklar ist, ungeniert weiter fragen... wer nicht fragt bleibt dumm (o;
-junix
-
@junix
Wenn man mit einzelnen Ziffern arbeitet (Subroutine wie von mir angedacht) muß man garnix umwandeln sondern kann sofort mit dieser Ziffer als char arbeiten. Das untere Nibble entspricht ja schon der entsprechenden Binärzahl und das obere Nibble, konstant 3 (0011), stört nicht weiter da man nur die 3 Masken 1 (0001), 2 (0010) und 4 (0100) benutzt und damit ausmaskiert wird.
-
Stimmt, daran hatte ich gar nicht gedacht (o:
-junix
-
Also ich hab die Lösung
und ich moechte mich recht herzlich fuer eure Hilfe bedanken.
Fuer jeden, den die Lösung interessiert poste ich sie natuerlichich hoff mal, dass ich ihn richtig gepostet hab.... *g* Hab noch nie nen code gepostet
Lg
cuPI
-
So nun noch ein Lösungspost Versuch *g*
#pragma hdrstop #include <stdlib.h> #include <iostream.h> #include <conio.h> #pragma argsused int main(int argc, char* argv[]) { char import[2]; char binary[8]; int multipl = 0; cout << "Rechte (in nummer): "; cin >> import; for(int i = 2; i >= 0; i--) { switch (import[i]) { case '7': binary[0+multipl] = '1'; binary[1+multipl] = '1'; binary[2+multipl] = '1'; break; case '6': binary[0+multipl] = '0'; binary[1+multipl] = '1'; binary[2+multipl] = '1'; break; case '5': binary[0+multipl] = '1'; binary[1+multipl] = '0'; binary[2+multipl] = '1'; break; case '4': binary[0+multipl] = '0'; binary[1+multipl] = '0'; binary[2+multipl] = '1'; break; case '3': binary[0+multipl] = '1'; binary[1+multipl] = '1'; binary[2+multipl] = '0'; break; case '2': binary[0+multipl] = '0'; binary[1+multipl] = '1'; binary[2+multipl] = '0'; break; case '1': binary[0+multipl] = '1'; binary[1+multipl] = '0'; binary[2+multipl] = '0'; break; case '0': binary[0+multipl] = '0'; binary[1+multipl] = '0'; binary[2+multipl] = '0'; break; } multipl = multipl + 3; } cout << "-"; for(int i = 8; i >= 0; i--) { if(i == 8 || i == 5 || i == 2) { if (binary[i] == '1') cout << "r"; else cout << "-"; } if(i == 7 || i == 4 || i == 1) { if (binary[i] == '1') cout << "w"; else cout << "-"; } if(i == 6 || i == 3 || i == 0) { if (binary[i] == '1') cout << "x"; else cout << "-"; } } getch(); return 0; }
-
Hmmmm Denk mal über eine Lösung nach, die _keine_ switch benötigt...
als Hilfe geb ich dir mal folgenden Rahmen:
2 for schleifen
3 if abfragenVariablen beliebig. Empfohlen wird die Verwendung eines std::string. Ahja und was du ja gar nicht verwendet hast ist die Technik der Maskierung... Die wird in dem was ich grad im Kopf hab intensiv genutzt (o;
Denk darüber nach was Peter über das "umwandeln" gepostet hat. Deine Lösung funktioniert zwar, ist aber etwas hmmm ich sag mal sperrig (o:
-junix
[ Dieser Beitrag wurde am 28.05.2003 um 13:15 Uhr von junix editiert. ]
-
Irgendwie hast schon recht Is schon ein wenig "sperrig" *g*
Ich hab die Technik mit der Maskierung nicht angewandt, weil ich sie
irgendwie nicht richtig verstanden hab....Aber ich denk aufjedenfall darueber nochmal nach. Die Lösung in deinem
vorgegebenen Rahmen waere natuerlich um einiges kleiner :p