Quersummenprogramm funktioniert nicht



  • Hallo zusammen,

    wer findet den Fehler? 😉 Bei höheren Integer-Werten funktioniert das Programm nicht mehr richtig, es werden falsche Zahlen in den Array geschrieben..

    Danke schonmal 😉

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    
    /*** Berechnet die Quersumme eines Integers ***/
    int qs(int x)       {
        int maxlength = 10;
        int qs = 0;
        int arr[maxlength];
        for(int i = maxlength-1; i >= 0; i--)     {                 /* Array erstellen */
            arr[i] = (int) (x/pow(10,i));                           // 5623 : 10^5 = 0,5623 ~ 0;   5623 : 10^4 = 5,623 ~ 5 beim Konvertieren
            x = x - arr[i]*pow(10,i);                               // 5623 - 5000 = 623
        }
    
        printf("\n x = ");                                          /* Array drucken */
        for(int i = maxlength-1; i >= 0; i--)          {
            printf("%i ", arr[i]);
        }
    
        printf("\n");
        for(int i = 0; i < maxlength; i++)          {               /* Array aufsummieren */
            qs = qs + arr[i];
        }
        return qs;
    }
    
    int main()          {
        int x = 1265;
        int y = qs(x);
        printf(" Quersumme: %i \n \n", y);
        return 0;
    }
    


  • Entscheide dich, ob du C oder C++ programmieren willst (sind zwei verschiedene Sprachen). Im Moment programmierst du C in C++.

    Du Quersumme kann viel einfacher berechnet werden mit

    int digit_sum(int x)
    {
        int dsum = 0;
        while ( x > 0 )
        {
            dsum += x % 10;
            x /= 10;
        }
    
        return dsum;
    }
    


  • Wenn ich genau den gleichen Code in C compiliere, funktioniert das dann? Ich dachte die ganzen includes wären nur für C++?

    Hast du mir auch eine Lösung für C? 😉



  • Du mischt C und C++, bzw. du missbrauchst die Eigenschaft deines C++ Compilers C Quelltext zu übersetzen, weil du in deinen C++ Quelltext C Techniken/Funktionen benutzt.

    Die Header stdio.h und math.h sind C-Header, iostream ist ein C++ Header. Die Header der STL haben in der Regel keine Dateiendung, während die C-Header auf .h enden. Die C++ Pendants der C-Header haben ein c vorangstellt und keine Dateiendung ( stdio.h => cstdio ).

    Ein- und Ausgaben in C++ realisiert man über streams, z.b. cin/cout , in C benutzt man dafür scanf und printf .

    Hast du dir das selbst so beigebracht oder kommt das aus einem Buch/Tutorial/Kurs?

    Edit: Typos



  • Hey 😉

    Alles selbst beigebracht, habe es ohne Kurs für die Uni benötigt.
    Wenn ich nun nur ein Programm (kein OOP) benötige, das aber in Konsole sowie Datei ausgeben können soll, ist wohl C und nicht C++ die Sprache meiner Wahl, richtig?

    Wie gebe ich dann in C in eine txt aus? Das mache ich bis jetzt mit <iostream> und schließlich mit

    std::ofstream name;
    name.open("Name.txt");
    name << "Hier steht der Text.";
    

    aber das ist ja dann C++?

    Danke für die Hilfe 😉
    Trotzdem interessiert mich dann die C-Lösung der Quersumme 🙂



  • Trotzdem interessiert mich dann die C-Lösung der Quersumme

    Der "Rechenweg" bleibt der Gleiche. Bisschen Modulo und bisschen Dividieren.



  • ihaveaquestion schrieb:

    Wenn ich nun nur ein Programm (kein OOP) benötige, das aber in Konsole sowie Datei ausgeben können soll, ist wohl C und nicht C++ die Sprache meiner Wahl, richtig?

    Das ist total Latte, du kommst mit beiden Sprachen zum Ziel. Ob das resultierende Executable jetzt 200K kleiner ist, weil die C-Runtime schlanker ist als die C++ Runtime spielt doch überhaupt keine Rolle. Und: Man kann in C++ objektorientiert programmieren, man muss es aber nicht. C++ ist eine Multiparadigmen-Sprache, in der man auch funktional programmieren kann.

    Im Übrigen hat Icarus2 doch schon die Lösung gepostet.



  • ihaveaquestion schrieb:

    Wenn ich nun nur ein Programm (kein OOP) benötige, das aber in Konsole sowie Datei ausgeben können soll, ist wohl C und nicht C++ die Sprache meiner Wahl, richtig?

    Wenn ein Programm so klein ist, benutze ich normalerweise eine Skriptsprache. Ansonsten finde ich aber auch fuer kleine Programme C++ angenehmer, denn wenn ich mal schnell einen String verarbeiten will, habe ich keine Lust, einen extra-buffer dafuer anzulegen und manuell Speicher zu reservieren, sondern nutze die Stringklasse.



  • icarus2 schrieb:

    Du Quersumme kann viel einfacher berechnet werden ...

    kann man einfach machen, muss man aber nicht. Anbei eine overengineerte Lösung in C++:

    #include <boost/iterator/iterator_adaptor.hpp>
    #include <numeric>  // accumulate
    #include <iostream>
    
    // -- dieser Iterator läuft über die Ziffern einer Zahl 'number'>0 im Dezimalsystem
    class Digits10 : public boost::iterator_adaptor< Digits10, int, int, boost::forward_traversal_tag, int, std::ptrdiff_t >
    {
    public:
        explicit Digits10( int number = 0 )
            : iterator_adaptor( number )
        {}
    
        friend boost::iterator_core_access;
    private:
        void increment()
        {
            base_reference() /= 10;
        }
        int dereference() const
        {
            return base() % 10;
        }
    };
    
    int main()
    {
        using namespace std;
        for( int number; cin >> number; )
            cout << "Quersumme=" << accumulate( Digits10(number), Digits10(), 0 ) << endl;
        return 0;
    }
    

    🕶


Log in to reply