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,0625
    16 = 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 😉


Anmelden zum Antworten