umwandlungen von Datentypen und Aneinanderketten
-
Hallo erstmal
für die Schule sollen wir ein kleines C Programm schreiben dass eine Dezimalzahl in jedes belibige andere zahlensystem konvertieren kann, so, vom Sinn her habe ich da shcon einen plan, allesdings beim Programmieren haperts... also hier erstmal der Code:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { // vorbereitung // deklaration der variablen float D; // dezimalzahl float B; // basis des neuen zahlensystems float E; // ergebnis der division float R; // rest der division float DV; // dezimalzahl vorkommastellen float DN; // dezimalzahl nachkommastellen char* Zahl=0; // zahl im neuen system char* Hilfszahl=0; // zwischenspeicherung char Stelle[1]; //Zeichen einer Stelle // überschrift printf("\t\tDezimalzahl Umrechner\n"); printf("\t\t---------------------\n\n"); // eingaben printf("Dezimalzahl:"); scanf("%f",&D); printf("Basis des neuen Systems(max 36):"); scanf("%f",&B); // verarbeitung DV = (int)D; // DV werden nur die zahlen vor dem komma von D zugewiesen, da int nur ganzzahlen darstellen kann DN = D-DV; // DN werden die nachkomma stellen zugewiesen, dazu werden die vorkommazahlen die zuvor in DV gespeichert wurden von D abgezogen while(DV>0) { Hilfszahl = Zahl; E = (int)(DV/B); R = ((DV/B)-E)*R; if(R>9) { Stelle[0]=55+R; } else { Stelle[0]=48+R; } Zahl = Stelle; Zahl = Zahl + Hilfszahl; DV=E; } printf("%c\n",Zahl); system("PAUSE"); return 0; }
Die vorgehensweise ist folgende, ich dividiere die dezimalzahl durch die Basis des neuen Zahlensystems und Speicher dann den ganzzahligen wert in E und den rest multipliziert mit der basis in R, so rechnet man ja auch schriftlich normalerweise die zahlen um.
Beispiel:
538 Dezimal in Hexadezimal:
538 : 16 = 33,625 ----> 0,62516 = 10 = A
33 : 16 = 2,0625 ----> 0,062516 = 1
2 : 16 = 0,125 ----> 0,125*16 = 2
0--> Lösung von unten nach oben 21A
und so will cih dass auch in dem Programm berechenn.Da Die Zahl die als erstes berechent wird (in diesem fall A) als letztes Ausgegeben werden muss (21A <<- A ist das letztes zeichen) müssen die "neuen" zahlen/zeichen immer VOR die vroherigen, dazu will ich die bisherigen zeichen in eine zwischenvariable speichen (Hilfszahl) und dann nachher wenn das zuletzt berechnete Zeichen hinzugefügt worden ist wieder dranhängen
allerding funktioniert dass alles gar nciht, dass umwandeln der zahlen von float nach char und das mit den strings in C hab ich auch cniht verstanden, wo ist der unterschied zwischen
char* name
char name[100]
char name
char *name
und '12' und "jnxfkdjasnjka" ...?
und wie konvertiert man richtig?
ich hoffe ich konnte mein problem deutlich machen, sonst versuch ichs gerne nochmal zu erklären
-
Erstmal müsste Dein Programm abschmieren, da Du auf NULL-Pointern rumrödelst:
char* Zahl=0; // zahl im neuen system char* Hilfszahl=0; // zwischenspeicherung //... Hilfszahl = Zahl; //wo wurde Speicher für Zahl und Hilfszahl angefordert?
Ansonsten, ohne groß auf Deinen Code einzugehen:
Tausche die die einzelnen Zeichen einfach: Das Erste mit dem Letzten, das Zweite mit dem Vorletzten usw. Dann ist es richtig rum.
-
char Stelle[1]; //Zeichen einer Stelle
Warum wählst du hier ein Array ?
char Stelle;
Das reicht auch.
-
hmm, das ist ja dass ganze was ich nicht so richtig verstehe
was diese sachen genau bedeuten hab mir die Kapitel Arrays und pointer im galileo openbook angeschaut, aber wirklich helfen tut mir das nicht ... wozu ist das mti den pointern eigentlich gut und wo sind die string, es gibt ja irgendwie keinen datentyp "string", das verwirrt mich ziemlich....
-
[quote="Korhil"]
char Stelle[1]; //Zeichen einer Stelle
Warum wählst du hier ein Array ?
quote]Ich habe absolut keine ahnung, bin momentan einfach etwas wirr^^ versuch dat seid HEUTE MORGEN hinzubekommen, das ist echt frustirerend^^ zwischen durch hab ichs ma in C# versucht so'n kleines prog zuschreiben, das hab cih direkt hinbekommen ( da ist das irgendwie einfacher mit dem konvertieren und da gibts auch strings^^) in ANSI C raff ichs voll net aber unser Lehrer wills halt in ANSI C, daher muss ichs verstehen
-
Hallo,
so nun habe ich es endlich geschafft dass der Rechner läuft.ich habe gelernt, dass ein char Array sozusagen ein String ist somit war folgendes totaler quatsch :
char* Zahl=0; // zahl im neuen system char* Hilfszahl=0; // zwischenspeicherung char Stelle[1]; //Zeichen einer Stelle
dies habe ich ersetz durch:
char Zahl[255]; // zahl im neuen system char Hilfszahl[255]; // zwischenspeicherung char Stelle; // zeichen einer Stelle
Damit aus einer Zahl ein Zeichen wird muss mit die zahl ins format char konvertiert werden.
Stelle[0]=55+R; // ist falsch
Stelle=(char)(55+R); // ist richtig
Der ganze Code vom Program
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // vorbereitung // deklaration der variablen float D; // dezimalzahl int B; // basis des neuen zahlensystems float E; // ergebnis der division int R; // rest der division int DV; // dezimalzahl vorkommastellen float DN; // dezimalzahl nachkommastellen char Zahl[255]; // zahl im neuen system char Hilfszahl[255]; // zwischenspeicherung char Stelle; // zeichen einer Stelle int i; // schleifenhilfszahl // überschrift printf("\t\tDezimalzahl Umrechner\n"); printf("\t\t---------------------\n\n"); // eingaben printf("Dezimalzahl(Komma bitte als Punkt darstellen):"); scanf("%f",&D); // einlesen der dezimalzahl die umgerechnet werden soll printf("Basis des neuen Systems(max 36):"); scanf("%i",&B); // einlesen der neuen basis (maximal 36 weil mit den Zahlen 0-9 und den Buchstaben A-Z nur 36 verschiedene Zeichen dargestellt werden können) // verarbeitung DV = (int)D; // DV werden nur die zahlen vor dem komma von D zugewiesen, da int nur ganzzahlen darstellen kann DN = D-DV; // DN werden die nachkomma stellen zugewiesen, dazu werden die vorkommazahlen die zuvor in DV gespeichert wurden von D abgezogen for(i=0;Zahl[i]!= '\0';i++) // in dieser Schleife werden alle Felder des Arrays zahl durchlaufen und mit NULL gefüllt Zahl[i] = 0; // berechnen der neuen zahl vor dem komma while(DV>0) { for(i=0;Hilfszahl[i]!= '\0';i++) // in dieser Schleife werden alle Felder des Arrays Hilfszahl durchlaufen und mit NULL gefüllt Hilfszahl[i] = 0; strcpy(Hilfszahl,Zahl); // der wert von zahl wird in hilfszahl kopiert ... Hilfszahl = Zahl geht nicht, es wird folgender Fehler angezeigt: "incompatible types in assignment" - keine Ahnung warum, .. warummm??? E = (int)(DV/B); R = DV%B; if(R>9) // wenn die zahl größer 9 ist muss es ein buchstabe werden { R=55+R; Stelle=(char)R; } else // wenn kleiner 9 eine zahl { R=48+R; Stelle=(char)R; } for(i=0;Zahl[i]!= '\0';i++) // zahl wird in jedem schleifen durchgang vollständig geleert Zahl[i] = 0; Zahl[0] = Stelle; // der wert von stelle wird dem ersten feld in zahl zugewiesen strcat(Zahl,Hilfszahl); // hilfszahl wird an zahl angehangen, also der vorherige wert von zahl der in hilszahl gespeichert wurde kommt nun ans ende also hinter den neuen wert von zahl DV=E; // DV wird der neue wert E übergeben } //berechnen der nachkommastellen falls welche vorhanden if(DN!=0) strcat(Zahl,","); { while(DN > 0) { for(i=0;Hilfszahl[i]!= '\0';i++) // in dieser Schleife werden alle Felder des Arrays Hilfszahl durchlaufen und mit NULL gefüllt Hilfszahl[i] = 0; // damit keine unerwünschten werte in dem array stehen E=DN*B; R=(int)E; if(R>9) // wenn die zahl größer 9 ist muss es ein buchstabe werden { R=55+R; Stelle=(char)R; } else // wenn kleiner 9 eine zahl { R=48+R; Stelle=(char)R; } Hilfszahl[0]=Stelle; // der wert von stelle wird dem ersten feld von hilfzahl zugeweisen weil strcat(Zahl,Hilfszahl); // strcat(Zahl,Stelle) nicht funktioniert, ich denke mal weil Zahl eine Array ist, Stelle aber nicht DN=E-R; } } printf("\n\nDie Zahl lautet:%s\n",Zahl); // ausgabe der neuen zahl system("PAUSE"); return 0; }
Danke nochmal für die Hilfsversuche