Euro und Cent stellen einlesen und (ohne eine Schleife zu verwenden) formatiert ausgeben



  • Hallo,

    Wir habe folgende Aufgabe bekommen:
    Schreibe ein Programm das die Euro und die Cent stellen separat einließt bei 1.000 einen Punkt macht, zwischen Cent und Euro einen , macht und das ganze zum Schluss mit einem € Zeichen ausgibt. Verwende keine Schleife.
    Das soll dann zum schluss zb. so aussehen:
    Euro: 1234
    Cent: 5
    Ausgabe:******1.234,05€
    Das feld ist 15 stellen breit und die leeren stellen sollen mit sternen gefüllt werden.
    Das habe ich im Grunde auch hingekriegt nur mein problem ist das ich es einfach nicht ohne Schleife schaffe!
    Hier mein code

    int main()
    {
        int anzStellen =11;
        int euro,cent;
        char sterne[15]="**************";
        int laengeEuro=0;
        printf("Gib die Euro stellen des Betrags ein\n");
        scanf("%d",&euro);
        printf("Gib die Cent Stellen ein\n");
        scanf("%d",&cent);
        int temp=euro;
        int divisor=1;
        while(temp>0){
        temp/=10;
        anzStellen--;
        divisor*=10;
        }
       divisor/=10;
        if(euro>1000){
            anzStellen--;
        printf("%.*s%1d.",anzStellen,sterne,euro/divisor);
        euro%=divisor;
        printf("%d,%2.2d€",euro,cent);
        }else{
        printf("%.*s%d,%2.2d€",anzStellen,sterne,euro,cent);
        }
    
        return 0;
    }
    

    Hat jemand eine Idee wie man das ohne die Schleife(zum herausfinden wie lang die Zahl ist) schafft(bin übrigens totaler Anfänger!)?

    Danke, Grüße Fleckdalm



  • Ich würde mit sprintf() den Betrag in einen Zwischenspeicher packen und dann per strlen() berechnen, wieviele Füllzeichen gebraucht werden.



  • Dein Versuch mit den Codetags ist gescheitert, merkst du das eigentlich nicht?
    Nimm Rekursion, damit geht es auch.

    void rek(unsigned i,char*s)
    {
      sprintf(s-=4,"%03i",i%1000);s[3]='.';
      if(i/=1000) rek(i,s);
    }
    
      unsigned euro=1234, cent=5;
      char s[]="              ",*p=s;
      rek(euro,s+14);
      p+=strspn(p," 0");if(*p=='.')--p;
      printf("%s%s%02u","**************"+strlen(p),p,cent);
    


  • Wutz schrieb:

    Dein Versuch mit den Codetags ist gescheitert, merkst du das eigentlich nicht?
    Nimm Rekursion, damit geht es auch.

    void rek(unsigned i,char*s)
    {
      sprintf(s-=4,"%03i",i%1000);s[3]='.';
      if(i/=1000) rek(i,s);
    }
    
      unsigned euro=1234, cent=5;
      char s[]="              ",*p=s;
      rek(euro,s+14);
      p+=strspn(p," 0");if(*p=='.')--p;
      printf("%s%s%02u","**************"+strlen(p),p,cent);
    

    das ist eine funktionsschleife 🤡, er möchte aber keine schleifen.



  • strlen() nutzt intern sicherlich auch eine Schleife, oder?
    Dann ist doch sicherlich auch ne "Funktionsschleife" möglich.

    Das mit der Schleife versteh ich ansonsten auch nicht.

    Edit:
    Ohne Schleife, aber mit viel Gewürge meinerseits:
    Wenn die maximale breite 15 Felder beträgt und dabei noch ein \0 also 16 Felder. Manuell kann man sagen, dass 15 - 1(€) - 1(,) - 2(Centstellen)=11 Stellen für die die Euroangabe mit Punkten versehen werden muss. Bei 11 Stellen, wären 2 Punkte möglich: xxx.xxx.xxx(,xx€)
    Die maximal so anzuzeigende Zahl wäre also 999999999€ und 99Cent.

    Im nachfolgenden Programm betrachte ich NUR positive eingegebene Zahlen.

    int main() {
      unsigned int euro;
      unsigned int cent;
      unsigned int buffer;
      unsigned int part;
      char output[16]="***************";
    
      scanf("%u", &euro);     // natürlich mit %u für unsigned int
      scanf("%u", &cent);     
      buffer=euro%1000000000; // entferne überflüssige Zahlenbereiche
      cent=cent%100;          // falls größer als 2 stellen, schneide links einfach ab
    
      if((part=buffer/1000000)!=0) {
        if(part>99)
          sprintf(output, "%u.", part);
        else if(part>9)
          sprintf(output+1, "%u.", part);
        else
          sprintf(output+2, "%u.", part);
      }
    
      buffer=buffer-part*1000000000;
      if((part=buffer/1000)!=0) {
        if(part>99)
          sprintf(output+3, "%u.", part);
        else if(part>9)
          sprintf(output+4, "%u.", part);
        else
          sprintf(output+5, "%u.", part);
      }
    
      buffer=buffer-part*1000000;
      if((part=buffer)!=0) {
        if(part>99)
          sprintf(output+6, "%u,%u€", part, cent);
        else if(part>9)
          sprintf(output+7, "%u,%u€", part, cent);
        else
          sprintf(output+8, "%u,%u€", part, cent);
      }
    
      printf("%s", output);
      return 0;
    }
    

    Code kann man noch zusammenfassen. Hoffe das haut so hin, habs nicht geprüft. Vllt kannst du es ja verbessern, wenns nicht klappt 😉



  • Danke für eure Antworten! Ich habs jetztmit dares methode hingekriegt!

    Grüße fleckdalm


Anmelden zum Antworten