Forum: PC-Programmierung C++ Probleme mit Variablen


von Matze (Gast)


Lesenswert?

Hallo Community,

ich finde meinen Fehler einfach nicht.

Folgender Code erzeugt folgende Ausgabe:
1
#include <iostream>
2
#include <cstdlib>
3
using namespace std;
4
5
int main()
6
{
7
    unsigned int eancode;
8
    unsigned int ziffern[12];
9
10
    cout << "Bitte 13-steilligen EAN-Code eingeben" << endl;
11
    cin >> eancode; //Beispiel: 40 1270096310 9
12
    cout << "Folgender EANCode wurde eingegeben:" << eancode << endl;
13
    cout << "#################################" << endl;
14
15
    int i = 0;
16
    while(i!=12)
17
    {
18
        ziffern[i] = eancode%10;
19
        eancode/=10;
20
        cout<<"Ziffer " << i << "->" << ziffern[i]<<endl;
21
        i++;
22
    }
23
24
    system("PAUSE");
25
    return 0;
26
}
1
Bitte 13-steilligen EAN-Code eingeben
2
4012700963109 <- Eingegeben und Enter
3
Folgender EANCode wurde eingegeben: 4294967295
4
################################
5
Ziffer 0->5
6
Ziffer 1->9
7
Ziffer 2->2
8
Ziffer 3->7
9
Ziffer 4->6
10
Ziffer 5->9
11
Ziffer 6->4
12
Ziffer 7->9
13
Ziffer 8->2
14
Ziffer 9->4
15
Ziffer 10->0
16
Ziffer 11->0
17
Drücken Sie eine beliebige Taste . . .

Ich versteh den Fehler einfach nicht. Bitte helft mir!

Gruß Matze

von Peter II (Gast)


Lesenswert?

1
unsigned int eancode;
2
cin >> eancode;

wie groß darf int wohl maximal werden?

von Matze (Gast)


Lesenswert?

4294967295 < 4012700963109.

Mist! Vielen Dank fürs Augen öffnen.

Gruß,
Matze

von Karl H. (kbuchegg)


Lesenswert?

Und aufpassen. Nicht alles was 'Code' oder 'Nummer' heisst, ist auch 
tatsächlich numerisch.
Eine Telefon-Nummer heisst zwar 'Nummer', trotzdem ist es unklug dafür 
einen int oder long zum Speichern zu nehmen. Sieh derartige Dinge besser 
als String an. Dann klappt das zb auch mit der EIngabe von
1
+43 7234 1234 / 09
und dein Benutzer ist happy, wenn er Telefonnummern so eingeben kann, 
wie er es gewohnt ist.

Selbiges auch hier mit
1
40 1270096310 9
Das ist recht offensichtlich nicht mehr einfach nur eine Nummer.

Selbiges zb bei Kreditkartennummern oder EBAN, PIC

: Bearbeitet durch User
von Matze (Gast)


Lesenswert?

Danke auch für deine Info! Ich habe die Aufgabenstellung dann wohl etwas 
komplizierter gelöst, als nötig... vielleicht wäre Char wohl die 
einfachere Lösung gewesen.

Falls es jemanden interessiert, hier die Lösung meiner Aufgabe.
1
#include <iostream>
2
#include <cstdlib>
3
using namespace std;
4
5
int main()
6
{
7
    unsigned __int64 eancode;
8
    unsigned __int64 ziffern[12];
9
10
    cout << "Bitte 13-steilligen EAN-Code eingeben" << endl;
11
    cin >> eancode; //Beispiel: 40 1270096310 9
12
    //eancode = 4012700963109; // kann einkommentiert werden, wenn man keine Lust hast die Zahl von Hand einzugeben
13
    cout << "Folgender EANCode wurde eingegeben:" << eancode << endl;
14
    cout << "#################################" << endl;
15
16
    int i = 0;
17
    while(i<13) 
18
    {
19
        ziffern[i] = eancode%10;
20
        if(i == 12)
21
        {
22
        //Wenn wir bei der letzten Stelle angekommen sind, dürfen wir natürlich den EANCode nicht mehr durch 10 teilen!!!
23
        }
24
        else{
25
        eancode/=10;
26
        }
27
        cout<<"Ziffer " << i << "->" << ziffern[i]<<endl; // diese Zeile kann auskommentiert werden, wenn gewünscht!
28
        i++;
29
    }
30
31
    int summe1;
32
    int summe2;
33
    summe1 = (ziffern[12] + ziffern[10] + ziffern[8] + ziffern[6] + ziffern[4] + ziffern[2]); //Summe 1 berechnen
34
    summe2 = ((ziffern[11] + ziffern[9] + ziffern[7] + ziffern[5] + ziffern[3] + ziffern[1]) * 3); //Summe 2 berechnen
35
    int gesSumme = summe1+summe2; //Gesamtsumme berechnen
36
    cout << "Berechne Summe1:" << summe1 << endl;
37
    cout << "Berechne Summe2:" << summe2 << endl;
38
    cout << "Berechne Gesamtsumme:" << gesSumme << endl;
39
    cout << "#############################" << gesSumme << endl;
40
41
    //gültige Prüfsumme berechnen
42
    if(((gesSumme + ziffern[0])%10) == 0) //lässt sich die Gesamtsumme + die Prüfziffer durch 10 ohne Rest teilen, ist die Prüfsumme gültig!!
43
    {
44
    cout << "Prüfsumme gueltig!!:" << endl;
45
    }
46
    else
47
    {
48
    cout << "Prüfsumme ungueltig!!:" << endl;
49
    }
50
51
52
    system("PAUSE");
53
    return 0;
54
}

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:
> Danke auch für deine Info! Ich habe die Aufgabenstellung dann wohl etwas
> komplizierter gelöst, als nötig... vielleicht wäre Char wohl die
> einfachere Lösung gewesen.

wenn schon, dann ein char Array.
Aber da wir hier bei C++ sind, wäre ein std::string in Kombination mit 
der getline Funktion das Mittel der Wahl.

von nicht"Gast" (Gast)


Lesenswert?

Hallo,

was passiert eigentlich, wenn ich ausd versehen zu wenig Stellen 
eingebe? Nur so als Denkanstoß.

Grüße,

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:

>     unsigned __int64 ziffern[12];

Eine einzelne Ziffer kann maximal den WErt 9 haben!

>         ziffern[i] = eancode%10;

Dafür ist ein __int64 dann schon reichlich gross. Hier hätte es ein 
einfacher int auch getan. Selbst auf einem PC.

von Dr. Sommer (Gast)


Lesenswert?

Matze schrieb:
> unsigned __int64 eancode;
>     unsigned __int64 ziffern[12];

Warum verwendest du diese nicht standardisierten Datentypen, anstelle 
von int64_t laut C++ Standard? Warum verwendest du 64bit-Integer für 
einzelne Ziffern, und nicht zB uint8_t (8-Bit-Integer)?

von Matze (Gast)


Lesenswert?

Karl Heinz schrieb:
> Matze schrieb:
>
>>     unsigned __int64 ziffern[12];
>
> Eine einzelne Ziffer kann maximal den WErt 9 haben!
>
>>         ziffern[i] = eancode%10;
>
> Dafür ist ein __int64 dann schon reichlich gross. Hier hätte es ein
> einfacher int auch getan. Selbst auf einem PC.

Ja, sorry. Hab ich direkt nach dem Posten auch gesehen, dass das 
Blödsinn ist.

Dr. Sommer schrieb:
> Matze schrieb:
>> unsigned __int64 eancode;
>>     unsigned __int64 ziffern[12];
>
> Warum verwendest du diese nicht standardisierten Datentypen, anstelle
> von int64_t laut C++ Standard? Warum verwendest du 64bit-Integer für
> einzelne Ziffern, und nicht zB uint8_t (8-Bit-Integer)?

Daran hat wohl Google Schuld ;-) Ich hab einfach c++ Datentypen 
gegoogelt und mir den erstbesten Link angeschaut und dort war für mich 
__int64 angegeben. Ich bin mit den Standards von C++ noch nicht ganz so 
bewandert und fange tatsächlich erst an diese Sprache zu lernen.

Aber Danke für deine Anmerkung, ich werd mir wohl mal die Standardtypen 
in einem C++ Buch zu Gemüte führen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.