Lösung zu Aufgabe von highscore.de

Hi

beim Zugriff auf die einzelnen chars (generall auf Arraylemente, egal welcher Typ) beginnt man bei 0.
Beim Anlegen muss aber die tatsächliche Anzahl angegeben werden.

Also wenn man die Variable mit [3] anlegt, hat das Array 3 Elemente: [0], [1] und [2].

Bei char-Arrays gibt es aber noch eine Besonderheit: Da sie ja oft verwendet werden, um Strings (Tastatureingaben etc) abzuspeichern und diese ja nicht immer gleich viel Buchstaben haben, sondern auch kürzer sein können, gibt es so eine Art Ende-Zeichen.
Das wird eben am Schluss, nach dem letzten Buchstaben, noch mit abgespeichert.

cin, cout... kommen damit von selber klar, ohne dass man noch was tun muss.
Hier ist allerdings das Problem, dass dieses Schlusszeichen wie ein normaler Buchstabe auch seinen Platz im Array braucht.

Wenn du jetzt also 4 wirkliche Zeichen speichern willst, kommt noch das Schlusszeichen dazu = 5.
Anlegen musst du das Array dann auch mit [5], macht [0] [1] [2] [3] und [4].
[0] bis [3] für deine 4 Zeichen und [4] für das Schlusszeichen.

Gruß
 
Aber ist es nicht so, dass bei char die [0] auch mitzählt? So hab ich Platz für 4 Zeichen.
Bei der Deklaration eines Arrays gibt man nicht den höchsten Index, sondern die Anzahl der Elemente an. Somit stehen dir bei char zahl[3]; genau drei Zeichen zur Verfügung. Mit char zahl[4]; hättest du dementsprechend vier Zeichen, was für deine Zahl auch reichen würde. Allerdings kommt bei C-Strings immer noch ein abschließendes Nullzeichen ('\0') dazu, welches das Ende des Strings markiert. Also brauchst du tatsächlich fünf Zeichen, um eine vierstellige Zahl (als C-String) zu speichern.

Das mit dem width allerdings werd ich beherzigen, denn daran, dass beim cin mehr als 4 Zeichen eingegeben werden können hab ich nicht beachtet. Aber wie gesagt, ich lerne seit ungefähr 5 Tagen C++, da dürfen solche Fehler noch unterlaufen (zumal ich bislang ja nur Variablen und Operatoren kennen lernen durfte!
Der „Vorwurf“ war auch überhaupt nicht an dich gerichtet. Ich wünsche dir jedenfalls noch viel Erfolg mit C++ und viel Spaß auf tutorials.de :)

Grüße,
Matthias
 
Anmerkung:

Einige ältere versionen des micrsoft visual studio compilers wichen hier vom standart ab (k.a. ob sies immer noch tun) und reservierten für ein char[4] beispielsweise tatsächlich 5 byte.

Verursachte lustige probleme, wenn man versucht von einem windows programm an einen linux server datenstrukturen zu übermitteln die statische strings beinhalten und hat mich damals einige stunden debugging gekostet.
 
So, da bin ich wieder...

Danke erstmal für eure mehr als tollen Ratschläge, das hilft mir wirklich enorm weiter... Sich selbst in Eigenarbeit C++ beizubringen ist gar nicht so simpel wenn einem nur mehr oder weniger gute Tutorials zur Verfügung stehen.

Also die nächste Aufgabe, die es zu lösen gilt lautet:
Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer vierstelligen Zahl auffordert. Das Programm soll daraufhin die Quersumme der Zahl mit Hilfe einer Schleife errechnen und das Ergebnis dann auf den Bildschirm ausgeben.

Also quasi die gleiche Aufgabe wie oben, allerdings soll diesmal das Ergebnis als Schleife ausgerechnet werden.

Ich zeig euch einfach mal, wie weit ich gekommen bin und erklär euch dann meine Denkansätze:

C++:
#include <iostream> 
#include <iomanip>

int main() 
{ 
  char zahl[5];
  std::cout << "Willkommen!\n\n";
  std::cout << "Bitte geben eine 4-stellige Zahl ein: ";
  std::cin  >> std::setw(5) >> zahl;
  std::cout << "Die eingegebene Zahl lautet " << zahl << "\n" << std::endl;
  
  int i;
  int ergebnis;
  int ergebnis1;
  
   
  for (int i = 0; i < 3; i++)
      {
           std::cout << "i ist " << i << std::endl;
           ergebnis1 = (zahl[i] + zahl[i++]);
           std::cout << "ergebnis ist " << ergebnis << std::endl;
           std::cout << "zahl ist " << zahl[i] << std::endl;
                 
      }
  
  ergebnis = ergebnis1 - (4*48);
  std::cout << "\nDie Zahl ist " << zahl << std::endl;
  
  std::cout << "Das Ergebnis lautet: " << ergebnis << std::endl;
  
  system("PAUSE");
}

Also zunächst habe ich eure Ratschläge beherzigt und die Eingabe ein wenig begrenzt und das Array größer gemacht.

So, dann zur Schleife... Ich möchte ja, dass die Variable zahl hochgezählt wird von zahl[0] bis zahl[3] um das Ergebnis ausrechnen zu können, deshalb die for Schleife. Das hochzählen von i funktioniert auch grundsätzlich, allerdings weiß ich nicht, wie ich die Schleife so aufbaue, dass ergebnis = immer weiter aufgebaut wird (also mit zahl[0] beginnend und mit zahl[3] endend). Vielleicht weiß hier jemand Rat?

Ich weiß, dass das absolute Anfängerfragen sind, dafür möchte ich mich bei euch auch vielmals entschuldigen. Aber lesen allein hilft nicht immer, um logische Zusammenhänge zu erkennen (zumindest bei mir nicht).
 
Hi.

Versuch doch mal die Eingabe als Zahl einzulesen und nicht als String.

Eine Zahl kannst du mit Hilfe der Modulo Operation (%) und der Ganzzahldivision in Teile zerlegen.

Außerdem solltest du immer auch prüfen ob überhaupt etwas eingelesen wurde:
C++:
if (cin >> zahl) {
  ...
}
Gruß
 
Also das mit dem Prüfen mache ich im Normalfall auch, indem ich die einzelnen Arrays abfrage. Allerdings wird der Code ein wenig zu unübersichtlich wenn ich das hier posten würde, deshalb beschränke ich mich hier aufs eigentliche Problem.
Das mit der Zahl versteh ich nicht. Ich lese doch bei char einzelne Ziffern ins Arrays ein oder nicht? Da habe ich sie ja quasi schon zerlegt (was im ersten Teil ja auch super funktioniert hat, das Problem liegt ja eher an der Schleife).
 
Zuletzt bearbeitet:
cin kann auch Zahlen (mehrziffrig) gleich in eine int-Variable einlesen, die ja speziell für Zahlen gedacht ist.

Als String hast du zwar alles schon ziffernweise, jedoch im Ascii (die Sache mit dem -48) und es können auch andere Sachen dabei sein. Buchstaben, die nicht dazugehören etc...
cin überprüft die Zahl beim int-einlesen auch gleich, ob es wirklich eine Zahl ist.

Falls du doch beim String bleibst (und auch sonst): Was ist an der Schleife das Problem?
Statt zahl[0]+zahl[1]+... schreibst du eine Schleife, in der du zahl[x] immer zu einer Variable dazuaddierst (diese am Anfang auf 0 setzen)
 
Also das mit dem Prüfen mache ich im Normalfall auch, indem ich die einzelnen Arrays abfrage.
Damit kannst du aber nicht erkennen ob wirklich etwas eingelesen wurde. Zumal du das Array nicht initialisiert hast und somit zufällige Werte drin stehen.
Allerdings wird der Code ein wenig zu unübersichtlich wenn ich das hier posten würde, deshalb beschränke ich mich hier aufs eigentliche Problem.
Das mit der Zahl versteh ich nicht. Ich lese doch bei char einzelne Ziffern ins Arrays ein oder nicht? Da habe ich sie ja quasi schon zerlegt (was im ersten Teil ja auch super funktioniert hat, das Problem liegt ja eher an der Schleife).
Ja, aber wenn du es als Zahl einliest sparst du dir die Überprüfung ob der Benutzer auch wirklich eine Zahl eingeben hat.

Und in der Regel berechnet man die Quersumme einer Zahl mit Hilfe der Ganzzahldivision mit Rest.

Um eine Schleife zu bauen, brauchst du dann nur 2 einfache Regeln:

1. Quersumme von 0 ist 0.
2. anderenfalls, Quersumme = Quersumme von zahl / 10 + zahl % 10.

Gruß
 
Irgendwas stimmt aber doch an deiner Erklärung nicht. Es macht doch keinen Sinn eine Quersumme zu berechnen, indem ich die Quersumme benutze... Das wäre doch doppelt gemoppelt... außerdem les ich deinen Text so:
(Quersumme der Zahl 1234 geteilt durch 10 = 1) + (zahl % 10 = 4) = 5...
5 ist aber nicht die dezimale Quersumme von 1234 sondern 10.
Vielleicht hab ich dich auch gänzlich falsch verstanden!?
 
Hi

das Ganze ist ja auch in einer Schleife bzw. rekursiv gedacht.

Vielleicht wirds ja mit Code klarer:
C++:
int zahl = 1234;
...
int x = 0;
while (zahl != 0)
{
    x += zahl % 10;
    zahl /= 10;
}

Gruß
 
Zurück