Ich bin beim üben für meine Prüfung am verzwifeln, ich weiss nicht wie man zb. von -50 bis 25 alle geraden Zahlen zusammen rechnet
Wäre froh wenn jemand einen Beispielcode hätte
Anfäger
Ich bin beim üben für meine Prüfung am verzwifeln, ich weiss nicht wie man zb. von -50 bis 25 alle geraden Zahlen zusammen rechnet
Wäre froh wenn jemand einen Beispielcode hätte
Anfäger
Probiers mal mit einer for Schleife.
Wodurch ist eine gerade Zahl definiert?
Gruß Tommy
const int startZahl = -50;
const int stopZahl = 25;
unsigned int anzahlZahl;
int summeZahl;
unsigned int summeAbsZahl;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
int beginZahl = min(startZahl, stopZahl);
int endZahl = max(startZahl, stopZahl);
for (int i = beginZahl; i <= endZahl; i++)
{
anzahlZahl++;
summeZahl += i;
summeAbsZahl += abs(i);
Serial.println(i);
}
Serial.print(F("Durchläufe: "));
Serial.println(anzahlZahl);
Serial.print(F("Summe Ganzzahl: "));
Serial.println(summeZahl);
Serial.print(F("Summe Werte: "));
Serial.println(summeAbsZahl);
}
void loop()
{
}
-494
Genau die entscheidende Information fehlt vom TO:
Summe der Zahlen oder Summe der Absolutwerte.
@my_xy_projekt: nur die geraden Zahlen.
Gruß Tommy
??? - wie kommst Du da drauf? den zieh ich zurück - Siehe @Tommy56
Wenn denn 42.
Ach ja ... na denne...
const float startZahl = -50.1;
const float stopZahl = 25.9;
unsigned int anzahlZahl;
int summeZahl;
unsigned int summeAbsZahl;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
int beginZahl = min(startZahl, stopZahl);
int endZahl = max(startZahl, stopZahl);
for (int i = beginZahl; i <= endZahl; i++)
{
if (i % 2 == 0)
{
anzahlZahl++;
summeZahl += i;
summeAbsZahl += abs(i);
Serial.println(i);
}
}
Serial.print(F("Durchläufe: "));
Serial.println(anzahlZahl);
Serial.print(F("Summe Ganzzahl: "));
Serial.println(summeZahl);
Serial.print(F("Summe Werte: "));
Serial.println(summeAbsZahl);
}
void loop()
{
}
Und solltest die Durchläufe in Gänze wollen, dann gehört das aus der if Abfrage raus und davor gesetzt.
Du kannst dir die Zahlen von - 25 bis 25 sparen, die heben sich in der Summe zu 0 auf. Der Rest muss negativ sein, deswegen kannst du auch die positive Summe bis 50 rechnen, davon die bis 25 abziehen und negativ setzen. Für die Summe der ersten n Zahlen bzw. geraden Zahlen gibt es einfache Formeln - googlen findet die schnell.
Unter der Annahme, dass die beginZahl
gerade ist (wie z.B. -50), kann man das ohne Modulo lösen:
for (int i = beginZahl; i <= endZahl; i+=2)
{
Hallo
dadurch das kein Bogen drin ist , ist doch klar, damit bleibt nur 1, 11 usw. übrig
duck und weg
Gruß Heinz
Ist bei einer gerade Zahl das erste Bit (ganz Rechts) nicht immer 0?
Dann könnte man aufs Modulo verzichten und einfach das Bit auslesen. Weis aber nicht, ob das Leistung/Speicher spart.
Man kann die Annahme auch auflösen und garantieren
Einfach vor der Schleife aufaddieren:
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
int beginZahl = min(startZahl, stopZahl);
int endZahl = max(startZahl, stopZahl);
while (beginZahl % 2 != 0)
beginZahl++;
for (int i = beginZahl; i <= endZahl; i += 2)
{
anzahlZahl++;
summeZahl += i;
summeAbsZahl += abs(i);
Serial.println(i);
}
Serial.print(F("Durchläufe: "));
Serial.println(anzahlZahl);
Serial.print(F("Summe Geradezahl: "));
Serial.println(summeZahl);
Serial.print(F("Summe Werte: "));
Serial.println(summeAbsZahl);
}
Also wenn ich das while() aus meinem oben durch
if (bitRead(beginZahl,0))
bitSet(beginZahl,0);
ersetze, macht das Speichermäßig keine Änderung.
Aber nette Idee
Dann werden aber die ungeraden Zahlen aufaddiert.
bitClear() wäre besser aber auch nicht richtig, fängt dann zu früh an. Mit ++ liegt man auf der sicheren Seite. Oder ganz einfach:
beginZahl += odd(beginZahl);
Man kann das ganze doch auch negieren, oder?
Das war auch meine UrFassung, die ich aus einem nicht mehr bekannten Empfinden noch geändert hatte...
Da wird dann eine ungerade Zahl draus.
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
for (int i = 1; i<10; i++)
{
Serial.print(i); Serial.print(" ");
int tikZahl = i;
if (!bitRead(tikZahl, 0))
bitSet(tikZahl, 0);
Serial.println(tikZahl);
}
}
Ergebnis:
11:53:43.208 -> Start...
11:53:43.208 -> 1 1
11:53:43.208 -> 2 3
11:53:43.208 -> 3 3
11:53:43.208 -> 4 5
11:53:43.208 -> 5 5
11:53:43.208 -> 6 7
11:53:43.208 -> 7 7
11:53:43.208 -> 8 9
11:53:43.241 -> 9 9
Ich glaub wir reden aneinander vorbei. Ich meinte eigentlich aus Post #8 das Modulo einfach durch bitRead ersetzen
Ist gar nicht so einfach von Handy aus
if (!(i&1))
Stimmt. i&1
liefert 1, wenn das rechte Bit gesetzt ist, also die Zahl ungerade ist.