Fragen zur Machbarkeit in C/C++

Duda

Erfahrenes Mitglied
Hallo liebe Mitglieder,
hier meldet sich mal wieder einer mit null Ahnung und natürlich mit einigen Fragen, welche mir im Kopf rumschwirren. Habe um einige Grundlagen zu C++ zu bekommen zwei Bücher durchgeackert.
Das Erste "C++ Programmieren mit einfachen Beispielen >leicht>klar>sofort von Dirk Louis,
das Zweite"C++ Programmierung lernen>Anfangen>Anwenden>Verstehen von Andre Willms.
Beide Bücher geben mir viel, aber ich merke, daß ich mir noch wesentlich mehr aneignen muß um ein
Programm zu erstellen. Ich möchte aus den ersten 16 Hexzahlen eine Reihe von Zeichen eingeben,
aus dieser Reihe werden zwei Zeilen gebildet. Wenn von der 1. Position als ungerade ausgegangen wird,
Dann wären nachfolgenden Ungeraden die eine Zeile mit Werten, welche addiert werden sollen.
Und wenn von der 2.Position als gerage ausgegangen wird, dann wären alle nachfolgenden Gerade, also dies ist dann die andere Zeile mit den Werten, welche auch addiert werden sollen. Dann wird noch etwas
multipliziert und wieder addiert und dann gehts ab durch Modulo und es ergibt sich ein Rest.
Meine Fragen betreffen aus diesem Grund in erster Linie das Umsetzen von diversen Berechnungen,
welche nicht über die Grundrechenarten und Modulo hinausgehen. Allerdings werden die Werte von selbst zu erstellenden Variablen benutzt. Die Variablen wären die Zeichen 0 bis 9 und A bis Z, was den Werten 0 bis 35 entsprechen würde. Hauptsächlich werden zur Berechnungen 0-9 und A-F benutzt,
was den ersten 16 Hexzahlen gleich kommt und den Werten 0 bis 15 entspricht. Die Werte 16 bis 35 kommen erst in anschließenden Berechnungen(einschl.Modulo) zum Einsatz, wenn aus diesen Werten ein Rest gebildet wird, welcher dann einem entsprechenden Zeichen entspricht, welches als Prüfziffer verwendet wird. Hier nun ein Beispiel, wobei natürlich nur gezeigt werden soll was ich vorhabe.
Habe die Pluszeichen weggelassen, weil ich schon über Addition geschrieben hatte, auch sonst ent-
spricht es nicht ganz den C++-Konventionen.

3 2 2 6 3 7 4 2 2 7 4 8 C 0 8 7 0 0 8 4 3 A hier die Zeichen-Kette, C und A wie folgt dann in Zahlen !

3 2 3 4 2 4 12 8 0 8 3 = 49
2 6 7 2 7 8 0 7 0 4 10 = 53 * 2 = 106
----
155 MOD 34 = 19, was dann J ergibt,

weil J den Wert 19 in meiner unkonventionellen und nicht genormten Alphanumeric-Tabelle,
welche ich in Form von Variablen oder eine Datei anlegen möchte, welche im Programmablauf
mit eingebunden wird. Für Antworten, was machbar ist und was nicht, da würde ich mich freuen.

Viele Grüsse

Duda
 
Keiner Nachtrag,
habe nicht gewußt, daß die Zeilen nach links zum Anfang rutschen. Also die 155 haben sich aus der Addition von 49 + 106 gebildet. Sorry, wenn etwas unübersichtlich, man oder ich lerne ebend immernoch dazu.
Duda
 
Hi

Formatierung ist kein Problem, allerdings versteh ich ein paar andere Sachen grad nicht:
Alle 36 eingebbaren Werte (0-Z) sind zum Rechnen also durch andere Zahlen zu ersetzen, Zuordnung laut Datei?
(Wie ist die Datei aufgebaut?)
Woher kommt das *2 beim 53, und das 34 beim Modulo?

Machbar ist das alles.
Schulaugabe, Konsolenprogramm, C++ oder andere Bedingungen?
(frage nur, um besser einschätzen zu können, was erwartet ist)

Hast du schon Teile gemacht, fehlt ein Plan zur Vorgehensweise, gibt es Probleme bei bestimmten Teilen (zB. Dateilesen)...
kurz: Wo steckts zurzeit?
 
Hallo shell,
darauf reimt sich schnell, also danke für Dein Feedback. Meine Gedanken, welche nicht vorbehaftet sind mit der Denkweise eines C++-Programmierers, sind folgende: Weil ich mit den Werten meiner durch Variablen erstellten
36 Zeichen rechnen muß und nicht die genormte ASCII-Tabelle zum Einsatz bringen kann, deshalb denke ich da-
rüber nach, die Variablen gleich hinter:

#include <iostream>

using namespace std;

int main( )

{
int A=10,B=11,C=12;


oder so ähnlich mit einzufügen, da gibt es ja viele Möglichkeiten. Habe keine } gesetzt, weil es nur ein Beispiel
für eine Variablendefinition mit Zuweisungsoperator für die Werte sein soll. Aber ich wollte gern wissen, ob es auch möglich ist diese Variablen in eine Datei zu schreiben, welche dann innerhalb des Programmablaufs mit
aufgerufen wird.
Im Gedanken tendiere ich da nach char als Datentyp, weil ja nicht mehr Speicher verbraucht werdeb sollte als nötig. Okay, ein richtiger Programmierer macht sich da keine Gedanken, ich meine in Bezug auf die Grösse des Speichers. Doch dies nur am Rande, wie man so schön sagt. Ich mache mir auch Gedanke darüber, denn bei der Bildung der Prüfziffer muß ich ja den Wert in das Zeichen der Variable umwandeln. Okay, da müßte ich mir noch was einfallen lassen. Eventuell die Variablen nochmal anderst herum, damit nicht von den Alphanumerics auf die Werte zugegriffen wird, sondern von den Werten auf die Alphanumerics.
Zu dem * 2, das wird fest in eine integrierte Formel eingebaut. Auch das MOD mit der 34 wird fest in der Formel
mit eingebaut. Es ist damit unveränderlich ein Teil des Programmes.

1.)Die Additionssumme 49, aus Reihe1 wird so wie sie dasteht wieder für die weiter Addition verwendet.
2.)Die Additionssumme 53 wird mit 2 (welche ein feste Zahl im Programm ist) multipliziert.
3.)Die Summen aus 1.) und 2.) werden addiert.
4.)Die Summe aus 3.) durchläuft MOD 34(wobei die 34 eine feste Zahl im Programm ist), der Rest ist nun ein Wert,
welcher in eine Zahl von 0-9 oder in A-Y umgewandelt werden soll. Habe das Z nicht mit aufgeführt, weil es ausgeschlossen werden soll. Der Generator 34 hinter MOD läßt es auch nicht zu, daß ein Z herauskommt.
Soll so sein, weil das Z nicht mit einem Z an anderer Stelle kollidiert oder so.
Denn es geht natürlich noch weiter mit meiner Fragerei. Aber ich will nur kleine Schritte machen und erstmal diesen Teil des Programmes auf die Reihe bringen, wie es im Volksmund so schön heißt.
Ich hoffe Du steigts durch in dem Was ich so schreibe. Danke für Deine Mühe. Ich mölchte keinen Programmcode,
sondern nur Wege ob und wie ich das ganze bis hierhin handhaben kann. Ich bin nicht zu bequem zum Tippen,
aber ich möchte natürlich erst anfangen mit dem Progrämmchen. wenn ich auch sicher bin, daß es möglich ist.

Viele Grüsse

Duda
 
Weil ich mit den Werten meiner durch Variablen erstellten
36 Zeichen rechnen muß und nicht die genormte ASCII-Tabelle zum Einsatz bringen kann,
deshalb denke ich darüber nach, die Variablen gleich hinter...main...oder so ähnlich mit einzufügen
Jetzt versteh ich. Zuerst dachte ich, du willst verschiedene Zuordnungen ermöglichen, laut einer Datei.
Also A ist doch immer 10, B 11 usw.
Deine 26 Variablen sind eine Möglichkeit, aber sehr umtändlich zu handhaben.
a) Eben 26 Variablen machen müssen
b) Wenn man zB. Tastatureingaben und die Variablen irgendwie
"in Verbindung" bringen will brauchts jedes mal 26 if oder Ähnliches.

Was ich mir machen würde ist eine kleine Funktion zur Umwandlung Zeichen->Nummer
(und eventuell auch eine für den umgekehrten Weg).
Die Zuordnung ist ja nach einen relativ einfachen System aufgebaut.
(für Zuordnungen zwischen irgendwelchen x->y gibts Datenstrukturen wie Maps. Hier egal.)
zB. sowas:
C++:
char zeichen2nummer(char c)
{
   if(c >= '0' && c <= '9')
     return (c - '0');
   //Warum? Die Asciinummer für den "Buchstaben" 0 ist 48.
   //Ziffern haben genau so wie Buchstaben Nummernzuordnungen im Ascii-Code,
   //die nicht den selben Zahlenwert wie die Ziffer haben.
   //1 ist 49 usw...hier vom Buchstaben '0# (also 48) abziehen ist die Zahl

   if(c >= 'A' && c <= 'Z')
     return (c - 'A' + 10);
   //selbes System, A=65, B=66...

   if(c >= 'a' && c <= 'z')
     return (c - 'a' + 10);
   //auch Kleinbuchstaben unterstützen. 98 99...

   //Falls es nichts von dem war war es wohl ein ungültiges Zeichen
   //Fehlermeldung ausgeben oder sonst was, ich sag einfach "es war -1" ...
   return (-1);
}
...ohne die Kommentare wirds viel kürzer :)
Umgekehrt:
C++:
char nummer2zeichen(char c)
{
   if(c >= 0 && c <= 9)
     return (c + '0');

   if(c >= 10 && c <= 35)
     return (c + 'A' - 10);
   return '?'; //hier ? als Ungültig-Wert
}

Im Gedanken tendiere ich da nach char als Datentyp, weil ja nicht mehr Speicher verbraucht werdeb sollte als nötig. Okay, ein richtiger Programmierer macht sich da keine Gedanken, ich meine in Bezug auf die Grösse des Speichers. Doch dies nur am Rande, wie man so schön sagt.
:eek:
Natürlich hat nicht jeder Programmierer die selbe Meinung, aber die überwiegende Mehrheit
der mir bekannten Programmierer (inkl. mir selbst) kümmert sich sehr wohl um Speicher und Geschindigkeit.
Na gut, das liegt auch daran, was diese Zielgruppe so programmiert... ("i love asm" links oben :D)
Aber, so wie ein einzelnes char 1 byte und int 4 / 8 ... braucht, wenn man ein paar Billionen davon hat...
spätestens bei der Frage, ob man 100 oder 800 Festplatten kaufen muss macht sich jeder Gedanken :D

Ich mache mir auch Gedanke darüber, denn bei der Bildung der Prüfziffer muß ich ja den Wert in das Zeichen der Variable umwandeln. Okay, da müßte ich mir noch was einfallen lassen. Eventuell die Variablen nochmal anderst herum, damit nicht von den Alphanumerics auf die Werte zugegriffen wird, sondern von den Werten auf die Alphanumerics.
Siehe die Funktionen oben, erspart 2*26 Variablen.

Weitere Fragen natürlich immer gern gesehen :)
 
Zuletzt bearbeitet:
Hallo sheel,
habe Dir in einer meiner vorherigen Antworten einen neuen Namen gegeben, wie ich gerade festgestellt habe.
Aber beim Schnell, das möchte ich gern wiederholen. Also nochmals danke für Dein weiteres Feedback.
Also ich bin nicht darauf aus, das Programm schon im Voraus zu rationalisieren, was die Länge des Codes betrifft,
oder der Programmgeschwindigkeit. Habe Deinen Vorschlag zur Kenntnis genommen und werde mir das mal zu Gemüte führen. Den Standard-ASCII-Code kann ich leider nicht verwenden, darauf hatte ich schon hingewiesen.
Ich muß entweder alle Variablendefinitionen des gleichen Typs in einer Anweisung zusammenfassen. Auch ist mir im Nachhinein noch eingefallen wie ich das mit der Ausgabe der Zahlen oder Buchstaben für die Prüfziffer mache.
Das mit den Zahlen hierfür ist kein Problem(meine ich jedenfalls), aber kann man auch die Buchstaben ausgeben?
Wenn ich nun die Variablen 0 bis9 und A bis Z, was ja 36 Variablen sind um weitere Variablen von 10 bis 35 erhöhe und mit den Zahlen 10 bis 35 dann die Zeichen A bis Z ausgeben kann, dann wäre mir da eigentlich geholfen. Könnte man es auch so machen, auch wenn es Mehraufwand und ein längeres und unelegantes Programm bedeutet. Weil die genormte ASCII-Tabelle nützt mir nichts, weil mit ganz anderen Dezimalzahlen gerechnet wird. Der Hintergrund sind eventuelle Umwandelung Dezimalzahlen 0 bis 35 in Binärzahlen, im weiteren Verlauf des Programmes, das heißt in Bytes, aber ich will nun nicht noch weitere Dinge zur Sprache
bringen, denn soweit ist es noch nicht. Mir genügt erstmal die wenn ich weiss, daß es mit den Variablen funktionieren würde. Wobei ich vordergründig an das Einlesen einer Datei denke, welche die Variablen enthält.

0 = 0
usw.
9 = 9 bis hierhin ist es egal, weil Hex und Dez gleich sind.
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
usw.
Z = 36 bis hierhin werden die rechts stehenden Werten zum Rechnen benutzt.
Jetzt weitere Variablen, welche Buchstaben ausgeben sollen.
10 = A
11 = B
usw. bis
35 = Z
Nun nochmal meine Frage, könnte es so auch gemacht werden ?
Wenn ja, dann braucht es eine Lösung für die Eingabe der langen Reihe einstelliger Hexcodes(Hexzahlen)
und dem Trennen in 1. Additionszeile und 2. Additionszeile. Die Summen und das Multiplizieren der einen
Summe und das folgende Addieren, wonach dieser Summe dann das MOD 34 angehängt wird.
Der sich ergebende Rest ist die Zahl, mit der einige Variablen benannt sind,
welche dann Zahlen oder Buchstaben zurückgeben sollen. Diese Zahlen oder Buchstaben werden Prüfziffern, welche bei einer Datenübertragung abgefragt werden und deckungsgleich sein müssen, sonst wird die Datenübertragung verworfen. Der Empfänger der Daten rüft mit der gleichen Berechnung die Daten und
hat dem ensprechend auch die Prüfziffer und vergleicht diese, wenn keine Übereinstimmung, dann werden
die Daten nicht akzeptiert. Aber wie schon angekündigt, das Progrämmchen wird Schritt für Schritt aufgebaut,
ich meine wir müssen erstmal noch Eniges klären. Zu aller erst, was ist möglich mit meinen Variablen.

Viele Grüsse

Duda
 
Nachtrag: Oben beim Code +/-10 vergessen, jetzt oben richtiggestellt.

Zum neuen Beitrag: Jetzt bin ich sehr verwirrt :D

Prüfziffern usw. weggelassen schaut es für mich noch immer so aus,
dass du nur Umwandlungen 0<->0, 1<->1 ... 9<->9, 10<->A ... 35<->Z machen willst

Die "nicht genormte ASCII-Tabelle" muss ich wohl überlesen haben, aber
habe mein Leben lang noch keinen "Computer" in echt gesehen,
dessen Zeichensatz nicht auf ASCII basierte.
...sind etwas sehr selten.
 
Hi sheel,
natürlich hast Du recht, wenn Du schreibst, das Du noch keinen "Computer" in echt gesehen hast, dessen Zeichensatz nicht auf ASCII basierte. Natürlich regt es zum Lächeln an,
wenn Du schreibst: ... sind etwas sehr selten.
Aber in dem von mir geschilderten Fall geht es ja nicht um ASCII, sondern nur um die Zahlen 0 bis 35 und das Alphabet. Diese entsprechen nicht der ASCII-Tabelle, sondern sind umcodiert. Damit Du Einsicht bekommst,
werde ich versuchen es Dir zu erklären, stell Dir die ASCII-Tabelle nur mit den Dezimalzahlen und den Bytes
vor. Auch noch die Hexzahlen bis 0F. Alle anderen Zeichen sind nicht vorhanden. Jetzt stell Dir vor, die Zeichen
für die Zahlen 0 bis 9 werden auf die Dezimal-Positionen 0 bis 9 übertragen und danach folgen die Großbuchstaben unseres Alphabetes. Nun hast ein verschlüsselte oder codierte Tabelle, welche nicht so einfach zu entziffern oder zu decodieren ist. Dies ist der Grund, warum ich nicht mit der genormten ASCII-Tabelle arbeiten kann. Mir hat es viel Zeit und Verwirrung bereitet, bis ich dahinter gekommen bin, wie die Code-/Datenberechnung
zustande kommt. Ich hoffe Du kannst verstehen was ich schreibe, ich hoffe das es endgültig klärt, warum ich mit der genormten Tabelle nichts anfangen kann.
Denn zu Deinem letzten Sätzen kann ich nur sagen, daß es auch Computer/Datenübertragungssysteme oder Betriebssysteme gab/gibt, welche nicht auf den zu letzt genormten ASCII-Code basierten. Aber da müßte man sicher zu den Anfängen im Computerbau zurückgehen. Es kann natürlich auch sein, daß ich mich da irgendwie irre. Wenn es so ist, dann muß ich mich entschuldigen. Ich hoffe Du nimmst in dem Fall die Entschuldigung eines
70-Jährigen an. Ich weiß, nun ist der eigentliche Grund, wonach ich gefragt habe fast in der Versenkung verschwunden, aber ich bitte trotzdem um Hilfe wie man mein im obersten Beitrag geschildertes Vorhaben bewerkstelligen kann.

Für weitere Antworten bedanke ich mich im Voraus.

Viele Grüsse

Duda
 
Hallo Duda,

man könnte mit einer C Funktion hergehen:

char buffer[100];:
int a1,a2,a3, b1,b2,....;
scanf(buffer);
sscanf(buffer,"%02x-%02x-%02x",&a1,&b2,&a2);

wobei die Zeichkette dann "A4-C9-B2" verlangt (Beispiel).

die hexwerte A4, C9 und B2 werden dann in den Variablen a1, b2, und a2 gespeichert
 
Hallo jkallup,
danke für Dein Feedback, aber was Du vorschlägst geht an mein Thema vorbei. Ich denke wenn ich
es nicht über wie von mir gedacht, nur über Variablen lösen kann,
dann wird mir wohl nur noch ein Array weiterhelfen, in dem ich dann mit Array-Variablen die Lösung meines
Vorhabens zu realisieren versuche. In einer uralten DOS-Datenbank habe ich es ja auch realisiert,
wobei ich da im Voraus die Hex A, B, C, D. E und F als Zahlen eingegeben habe. Die Berechnung klappt perfekt,
leider mangelt es dann an der Umwandelung von Zahlen zurück in die Buchstaben des Alphabetes.
Mit Exel wäre es sicher kein Problem, aber ich möchte es ja gern mal in C/C++ ausprobieren.

Ich mache mal hier meinen unkonventionellen Entwurf, was ich später in den Programmcode mit einsetze.
Habe nur mal string geschrieben, ob es c_str oder was Anderes wird, das wird sich noch herausstellen.

string hex = "3 2 2 6 3 7 4 2 2 7 4 8 C 0 8 7 0 0 8 4 3 A";

int sum1 = hex[0] + hex[2] + hex[4] + hex[6] + hex[8] usw. bis + hex[20];
int sum2 = 2 * (hex[1] + hex[3] + hex[5] + hex[7] usw. bis +hex[21]);
int sum3 = sum1 + sum2
int sum4 = sum3 % 34

mit sum4 habe ich nun die Prüfziffer als Zahl, welche wenn >9, in einen Buchstaben umgewandelt wird.
Natürlich ist es im englischem Sprachgebrauch die checksum und im Programm natürlich auch.

Nun suche ich noch der Möglichkeit wie ich die Eingabe der 22 hexzeichen realisieren kann.

Aber jetzt erstmal Schluß und

Viele Grüsse

Duda
 
Zurück