c++ [Quersumme berechnen mit Funktion]


DerTrojaner

Mitglied
Hallo Community,

ich habe eine Aufgabe zu bewältigen die nicht richtig funktioniert, deshalb hoffe ich das mir ein Experte paar Tipps geben kann wo mein(e) Fehler sind.
___________________________________________________________________________________________________________________
Aufgabenstellung:

Schreiben Sie ein C++ Progreamm, welches die Quersumme einer 3-stelligen pos. Zahl berechnet. Dazu soll eine Funktion „quersumme3“ implementiert werden, welche als Argument eine ganze Zahl bekommt und als Ergebnis die Quersumme zurückgibt.
int quersumme3 (int z)

Demonstrieren Sie die Funktionsweise von „quersumme3“ innerhalb der Hauptprogrammfunktion „main()“,
indem Sie eine 3-stellige Zahl vom Nutzer einlesen und die Quersumme berechnen.

Hinweis: Es soll davon ausgegangen werden, dass der Nutzer wirklich immer 3-stellige positive Zahlen eingibt.
Sobald die Zahl größer als 999 ist oder kleiner als 99 ist soll eine Fehlermeldung erscheinen!
___________________________________________________________________________________________________________________

C++:
#include<iostream>
using namespace std;

int quersumme3 (int z)
{

 if (z > 99)
  {
   cout<<"Quersumme"<<endl;
  }

 else if (z < 99)
  {
   cout<<"Die Zahl muss 3-stellig sein!"<<endl;
  }
 else if (z > 999)
  {
   cout<<"Die Zahl muss 3-stellig sein!"<<endl;
  }  
   return z;  

}


main()
{
 int z, quersumme=0;
  cout<<"Geben sie Ihre 3-stellige Zahl ein!"<<endl;
  cin>>z;
 
 for (z; z>99; z=z/10)
  {
   quersumme=quersumme+z%10;
  }

 quersumme3(z);

 system("pause");
}
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Hi

Deine Funktion berechnet ja gar nichts (sondern überprüft nur auf Dreistelligkeit, und das erst noch falsch (was passiert bei Zahl 100?)).
Ich nehme mal an, der eigentliche Code ist hier (dieser Code muss aber unbedingt in die quersumme3-Funktion):
C++:
for (z; z>99; z=z/10)
  {
   quersumme=quersumme+z%10;
  }
Gehen wir es mal durch:
quersumme ist 0.
Ich gebe 123 ein.
z ist 123.
z > 99? -> Ja.
quersumme ist quersumme + z%10 = 0 + 3.

z ist z/10 = 12
z > 99? -> Nein.

=> Ausgabe Quersumme = 3.

Nun Fehleranalyse: Wo liegt der Fehler?
Antwort: In der Abbruchbedingung.
Was ist die Lösung des Problems?
((Selbst herausfinden, sonst fragen))

Hinweis: Es soll davon ausgegangen werden, dass der Nutzer wirklich immer 3-stellige positive Zahlen eingibt.
Sobald die Zahl größer als 999 ist oder kleiner als 99 ist soll eine Fehlermeldung erscheinen!
Falsch, kleiner als 100 (das steht hoffentlich nicht so in der Aufgabenstellung...).

Gruss
cwriter
 

DerTrojaner

Mitglied
Falsch, kleiner als 100 (das steht hoffentlich nicht so in der Aufgabenstellung...).
Das Programm soll nur 3 stellige Zahlen annehmen
 

abdellaui

Erfahrenes Mitglied
Ich will mein Senft auch dazu geben :D

Ein Tipp:
Verwende keine elseif Verzweigung, um einen Zahlenbereich ungültig zu definieren. Das Schlüsselwort liegt in der Aufgabenstellung:

"Sobald die Zahl größer als 999 ist oder kleiner als 100 (Korrektur) ist, soll eine Fehlermeldung erscheinen!"

Das du dies aber nicht in der Funktion abhandeln sollst, ist dir ja mittlerweile deutlich geworden. Da bleibt ja nur noch die for-Schleife für die Funktion über.
Als Abbruchbedinung solltest du dir klar machen, wann du eine Zahl durchgelaufen hast. Eine kleine Demonstration:

Code:
Schritt    Eingabe       Operation       Ausgabe
------------------------------------------------
1             11111            / 10          1111
2              1111            / 10           111
3               111            / 10            11
4                11            / 10             1
5                 1            / 10             0
6                 0            / 10             0
7                 0            / 10             0
8                 0            / 10             0
9                 0            / 10             0
Viel Spaß :D
 
Zuletzt bearbeitet:

Schaarkarl

Grünschnabel
Ich habe diesen - zugegeben nicht besonders eleganten - Code erstellt, der allerdings funktioniert:
C++:
#include <iostream>

int quersumme3(int z) {

       int y = 100, x = 0, w = 0;
       while (y != 0) {
             x = (z / y);
             z = z - (x * y);
             y = y / 10;
             w = w + x;
       }
       return w;
}

int main() {

       int z = 0;
       std::cout << "Geben Sie bitte eine Zahl ein, deren Quersumme Sie berechnen moechten: ";
       std::cin >> z;

       if (z < 100 || z > 999) {
             std::cout << "Die Zahl " << z << " ist nicht dreistellig!";
             return 0;
       }
       std::cout << "\nDie Quersumme ist " << quersumme3(z) << ".\n\n";
       return 0;
}
 
Zuletzt bearbeitet von einem Moderator:

ComFreek

Mod | @comfreek
Moderator
Ich habe diesen - zugegeben nicht besonders eleganten - Code erstellt, der allerdings funktioniert:
Allerdings nur für nichtnegative maximal dreistellige Zahlen. Auch wenn das die Aufgabe im OP so gefordert hat, so macht diese Einschränkung den Code schwerer zu lesen, als wenn du einfach den allgemeinen Fall implementiert hättest :) Versuch's ruhig mal!
 

Schaarkarl

Grünschnabel
So funktioniert es auch mit Zahlen die weniger oder mehr als drei Stellen haben bzw. negativ sind. Bei einer negativen Zahl wird eine negative Quersumme ausgegeben, was aber m. E. logisch ist:

#include <iostream>

int quersumme(int z) {

int y = 1, x = 0, w = 0;

while ((z / y) > 1 || (z / y) < -1) {
y *= 10;}

while (y != 0) {
x = (z / y);
z -= (x * y);
y /= 10;
w += x;}

return w;}

int main() {
int z = 0;
std::cout << "Geben Sie bitte eine Zahl ein, deren Quersumme Sie berechnen moechten: ";
std::cin >> z;

std::cout << "\nDie Quersumme ist " << quersumme(z) << ".\n\n";
return 0;}
 

ComFreek

Mod | @comfreek
Moderator
@Schaarkarl Bitte benutze Codetags, siehe meine Signatur. Editiere denien Beitrag dann entsprechend.

Dein Algorithmus ist aber immer noch unidiomatisch. Probier mal Folgendes:
C++:
int quersumme(int z) {
 int sum = 0;
 
 while (z != 0) {
  sum += z % 10;
  z /= 10;
 }
 
 return sum;
}
Siehst du, dass es die Quersumme berechnet?
 

Schaarkarl

Grünschnabel
Ja, vielen Dank. Ich habe erst vor ca. 2 Monaten angefangen, zu programmieren und muss wohl noch alle Funktionalitäten des Modulo-Operators lernen. Einen ähnlichen Code hatte ich schon gefunden aber halt nicht restlos verstanden. Deshalb die vier Variablen und die unelegante Lösung.
 

Schaarkarl

Grünschnabel
Mit diesem Algorithmus lässt sich die Funktion auch sehr gut rekursiv darstellen:

Code:
int rekquersumme(int z, int sum) {
if (z != 0) {
sum += z % 10;
return rekquersumme((z / 10), sum);
}
return (0, sum);
}
 

Neue Beiträge