HILFE! schleife funktioniert nich
-
==!0 schreibt man normalerweise !=0
-
kann das ==!0 denn bewirken, dass s nich funktioniert? unser infolehrer hat uns das sogar so auf kopien gegeben...
na ja, ich muss schon mitzählen, wie oft das durchlaufen wird, ich will ja ne prüfziffer haben. die gibt an, welche zahl ich addieren müsste um auf das nächste vielfache von 10 zukommen.
bsp: summe=13 ...wird auf hier unwichtige weise berechnet.dann muss die 20 erreicht werden. also müsste man 7mal 1 addieren
--> z ist 7.
so sollte das funktionieren. einfacher konnte ichs mir nich machen.
aber danke schonmal, ich probier das mit dem !=0 aus...
thx
-
"eigentlich sollte sie so lange hochzählen bis summe ein vielfaches von 10 ist." Ein vielfaches von 10 ist nicht:
while(summe%10==!0)
sondern:
while(summe%10==0)
Beispiel:
include <iostream> using namespace std; int main() { unsigned short small; unsigned long large; const unsigned short MAXSMALL=65535; cout << "Bitte eine kleine Zahl eingeben: "; cin >> small; cout << "Bitte eine grosse Zahl eingeben: "; cin >> large; cout << "Klein: " << small << "...";18:19: // Bei jedem Schleifendurchlauf drei Bedingungen testen while (small < large && large > 0 && small < MAXSMALL) { if (small % 5000 == 0) // Alle 5000 Zeilen einen Punkt ausgeben { cout << "."; small++; large -= 2; } } cout << "\nKlein: " << small << " Gross: " << large << endl; cin.get(); cin.ignore(); return 0; }
Hier die Erklärung:
Dieses Programm stellt ein Spiel dar. Man gibt zwei Zahlen ein, eine kleine (small) und eine große (large). Die kleinere Zahl wird um 1 nach oben gezählt, die größere in Schritten von 2 abwärts. Es ist nun zu erraten, wann sich die Zahlen treffen.In den Zeilen 12 bis 15 erfolgt die Eingabe der Zahlen. Zeile 20 richtet eine while- Schleife ein, deren Durchläufe von drei Bedingungen abhängig sind:
small ist nicht größer als large.
large ist nicht negativ.
small überschreitet nicht die Größe einer kleinen Integer-Zahl (MAXSMALL).
Zeile 23 berechnet den Wert von small modulo 5.000. Der Wert in small bleibt dabei unverändert. Der Ausdruck liefert das Ergebnis 0, wenn small ein genaues Vielfaches von 5.000 ist. In diesem Fall gibt das Programm als Fortschrittskontrolle einen Punkt auf dem Bildschirm aus. Zeile 26 inkrementiert den Wert von small, während Zeile 28 den Wert von large um 2 dekrementiert.Wenn irgendeine der drei Bedingungen in der while-Schleife nicht erfüllt ist, endet die Schleife, und die Ausführung des Programms setzt sich nach der schließenden Klammer der while-Schleife in Zeile 29 fort.
Ich hoffe ich konnte helfen!
MFG
Cebinem
-
Cebinem schrieb:
"eigentlich sollte sie so lange hochzählen bis summe ein vielfaches von 10 ist." Ein vielfaches von 10 ist nicht:
while(summe%10==!0)
sondern:
while(summe%10==0)
Eben deshalb muss getestet werden, ob es kein Vielfaches ist, damit man es aufzählen kann, bis es ein Vielfaches ist.
MfG
Stentor
-
also... danke erstmal für das programm.
also % is doch modulo... also durch x teilen und rest "ausgeben"
sprich 13%10=3. oder?
nunja, das will ich so lange machen, bis ich da ne 0 stehen hab... sprich 20%10=0... also muss ich das doch so lange machen wie x%10 nicht 0 ist.
es heißt doch:
solange(x mod(10) nicht 0)
{
mache
}
ich hab gedacht so müsste das funktionieren... tut es aber nicht.
wenn ich
summe%10==0 mache, fängt er ja gar nicht an zu zählen, da z.B. 13%10=3 ist, oder hab ich da was bei while falsch verstanden???außerdem, selbst wenn ich das eingebe, was ich schon versucht hab, komm ich auch am ende auf z=0.
-
DANKE an Stentor, ich hab da einen Denkfehler gehabt.
An mentesis:
Sorry ich hab mich mitwhile(summe%10==0)
geirrt. Natürlich muss getestet werden, ob es kein Vielfaches ist, damit man es aufzählen kann, bis es ein Vielfaches ist. Also machst du das so:
while(summe%10!=0)
Das
while(summe%10==!0)
kann durchaus dazu führen, das die While-Schleife nicht funktioniert, weil das soweit ich weiß kein gültiger Operator ist. Ansonsten sehe ich keine Fehler in deinem Quellcode.
MFG
Cebinem
-
hier mal ein einfacherer weg um an der schleife vorbeizukommen:
Summe+=10-summe%10;
-
Cebinem schrieb:
Das
while(summe%10==!0)
kann durchaus dazu führen, das die While-Schleife nicht funktioniert, weil das soweit ich weiß kein gültiger Operator ist.
Das ist absolut gültig. Nur sind das 2 Operatoren und nicht einer, Vergleich auf Gleichheit (==) und logisch nicht (!).
-
aber dann ist a==!b ja äquivalent zu a!=b, oder irre ich wieder?
-
Wenn beides bools wären, wäre es dasselbe. Aber mit ints ist es einfach nur ein schönes Beispiel dafür, warum implizite Konvertierungen übel riechen.
-
also, das funzt immer noch nich richtig, ich kann mir nich helfen!
hier mal der code für diese routine:#ifndef PRUEFZ_HPP #define PRUEFZ_HPP //Prüfziffer des Barcode 2/5 Industrial ermitteln. //int n ...Anzahl der Ziffern im Array //int norm[] ...Array mit Zahlen, deren Prüfziffer ermittelt werden soll //--> Ziffern von 0 nach n-1 abwechselnd mit 3 beginnend mit 3 und 1 multiplizieren. Produkte Addieren. Prüfziffer ist die Zahl, die addiert werden muss, um auf das nächste Vielfache von 10 zukommen. int pz (int n,int norm[]) { int summe=0; int z=0; for(int i=0;i<=n;i+=2) summe+=norm[i]*3; for(int i=1;i<n;i+=2) summe+=norm[i]*1; z=10-(summe%10); return z; } #endif
so, das funktioniert auch bei einbinden und compilieren, bloß bekomm ich immer z=0. wenns hilft: wenn ich bei der zweiten schleife das mache:
for(int i=1;i<=n;i+=2) summe+=norm[i]*1;
dann kommt z=1 zurück.
ich versteh das nich...
bitte helfen!
-
Mis2com schrieb:
aber dann ist a==!b ja äquivalent zu a!=b, oder irre ich wieder?
Yep, da irrst du dich. Ein Äquivalent zu a==!b fällt mir im Moment nicht ein. Zu a!=b ist !(a==b) äquivalent.
Nachtrag:
@mentesis
Sollte es vielleicht daran liegen:for(int i=0;i<=n;i+=2) summe+=norm[i]*3;
was eher so aussehen sollte:
for(int i=0;i<n;i+=2) summe+=norm[i]*3;
nochwas:
Es kann gar nicht sein, dass z=0 ist.z=10-(summe%10);
summe%10 wird irgendwas zwischen 0 bis 9. Subtrahiert man das von 10 bekommt man irgendwas zwischen 1 bis 10. Wobei 10 ja für den Algo Quatsch ist. Deshalb muss der Code irgendwie so aussehen:
z=(10-(summe%10))%10;
-
ok, an das problem mit der 10 hatte ich noch gar nicht gedacht...
das ist ja das problem! egal wie ichs mach, es kommt immer 0 oder 1 raus, jenachdem ob ich da halt <= oder nur < hinschreib. das kotzt mich so an! soll ich mal den kompletten quellcode reinstellen? würde das jemanden helfen?!
-
Hallo,
ich verfolg den Thread schon eine Weile, und irgendwie steig ich überhaupt nicht mehr durch. Liegt möglicherweise auch an mir. Aber was genau ist denn deine Aufgabe? Ein Vielfaches von 10 berechnen, oder den Modulo Operator verstehen?
-
moin!
also...ich weis jetzt nich, ob ich das hier schonmal geschrieben hatte. ich hab bei dem projekt nämlich mehrere probleme.
es gibt doch diesen strichcode auf allen möglichen verpackungen und so was. der nennt sich barcode 2/5 industrial. ich hab da nen schlüssel bekommen und soll jetzt nen programm dafür schreiben. das soll dann aus einer dezimal zahl nen barcode und umgekehrt machen. so ein barcode besteht aus einem startzeichen, dem eigentlichem code aus 0en und 1en, einer prüfziffer und einem stoppzeichen.
und um diese prüfziffer gehts eigentlich in diesem thread. und zwar multiplizier ich abwechselnd die einzelnen dezimalzahlen der reihe nach mit 1 und 3. dann addier ich das und die zahl, die addiert werden muss, um das nächste vielfache von 10 zuerhalten ist die prüfziffer.
und bei meiner routine hab ich irgendwie arge probleme, und hab keinen schimmer, was ich machen könnte.
so siehts aus.
-
So hab jetzt mal folgende Funktion getestet:
int pz(int n, int norm[]) { int summe = 0; for (int i = 0; i < n; i += 2) summe += norm[i] * 3; for (int i = 1; i < n; i += 2) summe += norm[i]; return (10 - (summe % 10)) % 10; }
Und funktioniert. Wo genau liegt dein Problem? Bist du dir auch sicher, dass zuerst mit 3 und dann mit 1 multipliziert wird? Oder könnte das auch andersrum sein?
-
so,also ich hab jetzt noch mal alle headerdateien neugeschrieben und um sortiert... im prinzip hab ich nur noch mal alles abgeschrieben und siehe da... es funzt. komisch oder?
danke trotzdem nochmal