Seite 1 von 2
mit for schleifen expermentieren
Verfasst: Montag 15. April 2019, 22:07
von moh
Schreiben Sie in Python und C ein Programm, welches mittels zweier Schleifen folgende Ausgabe erzeugt:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
Ich habe vorkurzem programmiern an zulernen.
ich hab diese Frage aber weiß nicht, weder das Anfang noch das Ende der for_schleife.
Danke an allen !
Re: mit for schleifen expermentieren
Verfasst: Montag 15. April 2019, 23:01
von sparrow
Ich würde im
Tutorial der Dokumentation nachschlagen.
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 07:05
von Sirius3
@moh: ich würde sagen, die for-Schleife startet mit einer 1 und endet mit einer 1.
Die Forderung, dass es exakt zwei for-Schleifen sein müssen, läßt befürchten, dass Du kein Python schreiben sollst, sondern C in Python-Syntax.
Was hast Du schon über for-Schleifen gelernt und wie wendet man sie an?
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 13:07
von moh
nicht viel, bin noch anfänger.
Die Grundlagen .
for schleifer wird genutzt um anwisung zu wiedaholen.
Leider dein Vorschlag mit 1,1 hat nicht funktoniert.
mit diesem code habe ich ähnliche Ergebnise bekommen aber Klar die ausgabe Form ganz anders aussieht
for i in range(1,4):
for j in range (1,5):
print(i,j)
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 13:46
von __blackjack__
@moh: Welcher Vorschlag hat nicht funktioniert? Was hast Du denn aufgrund des Vorschlags an Code geschrieben?
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 22:16
von moh
wenn die for_schleife mit eins beginnt und dann bei 1 aufhört was soll mein programm ausgeben?
for m in range(1,1):
print(m)
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 22:25
von __blackjack__
@moh: So geht das natürlich nicht. `range()` liefert ja nur aufsteigende Zahlen, Du brauchst aber Zahlen die bei 1 beginnen, bis 5 aufsteigen, dann wieder absteigen und mit 1 enden. Da gibt es in Python mehrere Möglichkeiten sich das zu basteln. Im Grunde mehr als in C, weil ich mir das in Python wahrscheinlich aus entsprechenden Teilen zusammensetzen würde, während in C eher nur das berechnen dieser Zahlenfolge aus einer Folge von nur aufsteigenden Zahlen in Frage kommt.
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 22:54
von moh
__blackjack__ hat geschrieben: Dienstag 16. April 2019, 22:25
@moh: So geht das natürlich nicht. `range()` liefert ja nur aufsteigende Zahlen, Du brauchst aber Zahlen die bei 1 beginnen, bis 5 aufsteigen, dann wieder absteigen und mit 1 enden. Da gibt es in Python mehrere Möglichkeiten sich das zu basteln. Im Grunde mehr als in C, weil ich mir das in Python wahrscheinlich aus entsprechenden Teilen zusammensetzen würde, während in C eher nur das berechnen dieser Zahlenfolge aus einer Folge von nur aufsteigenden Zahlen in Frage kommt.
es ist zu viel für mich, ich kenne noch keine andere möglichkeiten.
kannst so ein code als bsp schreiben
Re: mit for schleifen expermentieren
Verfasst: Dienstag 16. April 2019, 23:43
von __blackjack__
@moh: Ich würde an Deiner Stelle eher in Richtung C denken, also erst das Problem in C lösen und die Lösung dann nach Python portieren. Dann braucht man das grundsätzlich nur einmal zu lösen.
Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 20:07
von sls
Puh, keine Ahnung wie man sowas *schön* in C umsetzt, da ich C gerade eh irgendwie lernen möchte mal ein Ansatz:
Code: Alles auswählen
#include <stdio.h>
int main()
{
int c = 5;
for (int a=1; a<10; a++)
{
for (int b=1; b<6; b++)
{
if (b == c)
{
printf("%d", b);
c--;
break;
}
printf("%d", b);
if (a == b)
{
break;
}
}
printf("\n");
}
}
Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 20:18
von __blackjack__
@sls: Die ``break``\s in der inneren Schleife sind halt irgendwie nicht schön. Die Aufgabe ist hier sozusagen aus `a` zu berechnen wie weit die innere Schleife laufen muss. Also die literale 6 ist da nicht gut. Ebenfalls die literale 10. Denn `c` und die 10 und die 6 hängen ja alle voneinander ab, sprich wenn Du `c` am Anfang ändern würdest, müsstest Du die 10 und die 6 auch ändern und zwar relativ zum Startwert von `c` – das lässt sich dann ja ausrechnen.
Wenn das C sein soll, dann fehlt das ``void`` in der Signatur um anzuzeigen, dass die `main()`-Funktion keine Argumente bekommt. So wie es da jetzt steht ist das C++, allerdings würde man dann idiomatischerweise Streams verwenden und nicht `printf()`. Und selbst dann wäre der korrekte Include dafür ``#include <cstdio>``.

Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 20:44
von sls
@__blackjack__:
ich habe das return 0; vergessen, der Compiler hat nicht gemeckert. Jetzt habe ich mich zumindest mal mit dem Thema auseinander gesetzt. Das mit den Literalen stimmt natürlich, ich überlege mir dann mal wie ich die Logik am besten umkehren kann, damit ich kein break mehr brauche.
Code: Alles auswählen
#include <stdio.h>
int main(void)
{
int a = 10;
int b = a / 2;
for (int c=1; c<a; c++)
{
for (int d=1; d<b+1; d++)
{
if (d == b)
{
printf("%d", d);
b--;
break;
}
printf("%d", d);
if (c == d)
{
break;
}
}
printf("\n");
}
}
Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 20:44
von Sirius3
Ohne exzessives Pointer-Gefummel ist es kein C:
Code: Alles auswählen
#include <stdio.h>
int main(void) {
char *fmt = "%d %d %d %d %d\n";
int k;
for(k=0;k<9;k++) {
printf(fmt + (k<5?4-k:k-4)*3, 1, 2, 3, 4, 5);
}
return 0;
}
Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 21:05
von __blackjack__
@Sirius3: Schöne Lösung

aber nur die halbe Punktzahl weil nur die halbe Anzahl geforderter ``for``-Schleifen verbaut wurden.
Wobei das Folgen haben kann wenn die Anzahl der Argumente nicht mit der Anzahl der Platzhalter im ersten Argument übereinstimmt. Je nach Compiler/Platform kann da Datenmüll auf dem Stack liegen bleiben und das ``return`` dann ins Nirwana springen/das Programm zum Absturz bringen.
Re: mit for schleifen expermentieren
Verfasst: Mittwoch 17. April 2019, 22:28
von kbr
Komme leider auch nur auf die halbe Punktzahl ...
Code: Alles auswählen
l = []
for p in range(1, 10):
l.append(p) if p < 6 else l.pop()
print(' '.join(map(str, l)))
Re: mit for schleifen expermentieren
Verfasst: Donnerstag 18. April 2019, 11:57
von ThomasL
moh hat geschrieben: Montag 15. April 2019, 22:07
Schreiben Sie in Python (....) ein Programm, welches mittels zweier Schleifen folgende Ausgabe erzeugt:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
just for fun ...
Code: Alles auswählen
for i in [1,2,3,4,5,6,5,4,3,2,1]:
for j in range(1, i):
print(f'{j} ', end='')
print()
Re: mit for schleifen expermentieren
Verfasst: Donnerstag 18. April 2019, 17:38
von nezzcarth
kbr hat geschrieben: Mittwoch 17. April 2019, 22:28
Komme leider auch nur auf die halbe Punktzahl ...
Immerhin; mir bleiben alle Punkte verwehrt, weil die Schleifen ganz fehlen (dabei habe ich das damals mal so mit Pascal in der Schule gelernt, blöd) ...
Code: Alles auswählen
In [1]: def pyramid(x=1, treshold=5):
...: print(*range(1, x+1))
...: if x >= treshold:
...: return
...: else:
...: pyramid(x+1, treshold)
...: print(*range(1, x+1))
...:
In [2]: pyramid()
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
Re: mit for schleifen expermentieren
Verfasst: Donnerstag 18. April 2019, 21:48
von snafu
@nezzcarth: Originelle Idee. Es lässt sich noch etwas verkürzen:
Code: Alles auswählen
def pyramid(n, limit):
print(*range(1, n + 1))
if n < limit:
pyramid(n + 1, limit)
print(*range(1, n + 1))
if __name__ == '__main__':
pyramid(1, 5)
Re: mit for schleifen expermentieren
Verfasst: Donnerstag 18. April 2019, 22:13
von snafu
Oder bei Benutzung von
itertools:
Code: Alles auswählen
from itertools import chain
def pyramid(n):
for i in chain(range(1, n + 1), reversed(range(1, n))):
print(*range(1, i + 1))
if __name__ == '__main__':
pyramid(5)
Re: mit for schleifen expermentieren
Verfasst: Freitag 19. April 2019, 12:45
von nezzcarth
snafu hat geschrieben: Donnerstag 18. April 2019, 21:48
Es lässt sich noch etwas verkürzen:
Stimmt

Wobei am naheliegendsten natürlich dc wäre; geht sogar als "One-Liner":
Code: Alles auswählen
$ dc -e '0si5sx[li1+ddsj0sklbx[ ]pStsilx>a]sa[lk1+ddskn[ ]nlj>b]sb[li1-ddsj0sklbx[ ]pStsi1<c]sclaxlxsilcx'
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
