Frage zu C Einstieg

Status
Für weitere Antworten geschlossen.

Ensinger

Lt. Junior Grade
Registriert
Sep. 2013
Beiträge
311
Hallo, ich hab angefangen Informatik zu studieren.
Info 1 läuft bei uns über C.

Gerade arbeite ich mich in Schleifen und der printf Funktion ein.
Jetzt gibts da paar Übungsaufgaben, unter anderem Tabellen und Muster mit printf + verschachtelten Schleifen darstellen.

Ein Beispiel hab ich schon gelöst.
Man soll eine "Tabelle" mit Zeilen und Spalten angeben.
Zb

00
00
00

Habe das so gelöst:

#include <stdio.h>

int main (void)
{
int z = 4; // Anzahl Zeilen
int s = 2; // Anzahl Spalten

for (int a = 0; a < z; a++) {
for (int b = 0; b < s; b++) {
printf("0");
}
printf("\n");
}
return 0;
}

Bzw hier im Original. Im Zitat übernimmt es die Einrückungen nicht. Die gehören aber nach den Coding Conventions wohl zum richtigen Programmieren ^^

code1.PNG


Die äußere Schleife bestimmt die Anzahl der Zeilen (also Anzahl der Schleifendurchläufe).
Die innere Schleife die Inhalte/Anzahl der Spalten. In dem Fall hier:

00
00
00
00

Soweit so gut.
Nun wird aber zb folgendes vorgegeben:

0
00
000
0000

Oder

0
00
000
0000
000
00
0

Klar, das könnte man ganz primitiv mit etlichen printf Anweisungen machen
Ich würde es aber gerne ebenfalls mit Schleifen hinbekommen.

Wenn ichs einmal weiß, ists sicher total nachvollziehbar.
Ich komm aber nicht drauf ^^

Hat jemand einen Tipp bzw eine Erklärung?
Klar ich könnte den Code von Stackoverflow etc einfach kopieren.
Würds aber gern verstehen


Edit: Achso, das ist keine bepunktete Übung und ihr übernehmt jetzt die Arbeit für mich oder sowas. Nein, das ist nur fürs Verständnis vom Vorkurs, möchte es möglichst gut verstehen
 
Zuletzt bearbeitet:
Hier werden normalerweise generell keine Übungsaufgaben beantwortet - für soetwas gibt es Tutorien.

Wenn es bei dir jedoch an der Grundidee der Schleifen hapert, solltest du vielleicht die Basics zu Algorithmen nochmal durchgehen.
Zweiteres würde ich übrigens mit einer else oder else-if Schleife machen.

Und wenn du es nicht verstehst: Frag nach. Das ist generell einer der Grundpunkte, die man in jedem Studium lernen wird. Nur weil alle drin sitzen und nicken, heißt das nicht, dass alle es verstehen.
Zusätzlich würde ich als Vorkurs (...Ende Oktober weit nach VL-Start?) ohnehin noch Kurse bei z.B. Codecademy empfehlen. Basic reicht für das meiste.
 
Naja erste Zeile eine Null, zweite Zeile zwei Nullen, dritte Zeile drei Nullen...
erkenst du ein Muster?

Bei deinem ursprünglichen Code:
Erste Zeile zwei Nullen, zweite Zeile zwei Nullen, dritte Zeile zwei Nullen...
 
Weil ich gute Laune habe:
C:
// ;p
#include <stdio.h>

int main (void)
{
   int z = 4;
 
   for (int a = 0; a < z; a++) {
       for (int b = 0; b <= a; b++) {
       printf("0");
       }
   printf("\n");
   }
   return 0;
}

Habe hier die CODE-Tags genutzt und kein Zitat. Dann bleiben Einrückungen erhalten und es gibt sogar Syntax-Highlighting.

Wie du das jetzt spiegeln kannst, überlasse ich aber dir.

P.S.:
Wenn ichs einmal weiß, ists sicher total nachvollziehbar.
Ja, so ist das bei allem, was man zum ersten Mal macht. Aber genau darum geht es. Beim Programmieren wirst du mit Problemen konfrontiert. Du musst lernen, die selbst die entsprechende Lösung zu erarbeiten. Keine Algorithmen auswendig lernen, sondern dir selbst beibringen (du bist in der Uni und nicht mehr in der Schule), wie du selber gezielt einen Algorithmus findest o.ä.
Ich komm aber nicht drauf ^^
Noch mehr nachdenken, einen Schritt zurück gehen: Findest du Quellen, die die Herangehensweise erklären? und ansonsten: Ausprobieren. Das tolle am Programmieren ist: Du kommst schnell zu Ergebnissen und siehst sehr schnell selber, ob etwas funktioniert oder nicht. Außerdem geht dabei nichts kaputt. (Außer du programmierst an einem Kernel oder Gerätetreiber. Aber da bist du ja noch nicht ;) )
 
Zuletzt bearbeitet:
Der Kommentar ist ziemlich schlecht da irreführend. z wäre bei mir nach wie vor die Zeile... weil so wie der Kommentar ist, könnten in jeder Zeile beliebig viele 0en sein, hauptsache maximal z. Und wie viele Zeilen?
 
  • Gefällt mir
Reaktionen: madmax2010
oh man, ich habe gerade gesehen, dass meine Programmierkenntnisse aus "der Bibel" (The C Programming Language) von Kernighan/Ritchie von 1988 stammen (und das ist schon 2nd Edition...)

aber zum eigentlichen Problem, das habe ich nämlich nicht gar nicht durchschaut.

mal abgesehen von der der "merkwürdigen" Definition/Deklaration der Variablen (s.o. 1988 sah sowas anders aus) sieht es für mich so aus, als wenn du das mit "innerer/äußerer Schleife" doch durchschaut hast und es nur um irgendwelche komischen Ausgabeformate geht?!?
 
Das Konzept innere/äußere Schleife ist mir soweit klar.
Bzw dass die äußere Schleife mit der ersten Iteration startet, dann die zweite Schleife so oft wiederholt wird, bis die Bedingung nichtmehr erfüllt ist. Dann springt die äußere Schleife in die zweite Iteration, wo dann wieder die innere Schleife durchlaufen wird.

Das ist doch das Konzept der Verschachtelung oder? ^^
 
Das beste was du am Anfang machen kannst:
Sprich laut. Sag was du tust. Sag was du willst. Geh verbal durch, was passieren soll und was passiert.

Wenn du an einer Stelle hängst, überlege dir den nächsten Schritt und was du tun musst um da hin zu kommen

Wenn das nicht klappt: Überlegungen und aktuellen Code hier in den thread posten

Und sei nicht wie ich. Spezialisier dich auf etwas. Frühzeitig
Sonst bist du ein komischer embedded-devops-entwickler-machinelearning-security-jura Mensch, der eigentlich nirgendwo mehr angestellt werden kann und nur noch freiberuflich arbeiten kann
 
  • Gefällt mir
Reaktionen: tollertyp
Ja, das ist das Konzept der verschachtelten Schleifen. Warum auch immer man hier von einem Konzept sprechen muss.

Wenn du es nicht programmieren kannst, kannst du denn in Worte fassen, was passieren soll?

Programmieren hat viel mit Abstrahieren zu tun. Wie würdest du denn jemand erklären, was da passieren soll?

@madmax2010: :-)
 
tollertyp schrieb:
Naja erste Zeile eine Null, zweite Zeile zwei Nullen, dritte Zeile drei Nullen...
erkenst du ein Muster?

Bei deinem ursprünglichen Code:
Erste Zeile zwei Nullen, zweite Zeile zwei Nullen, dritte Zeile zwei Nullen...
Die Muster erkenne ich, aber weiß nichts damit anzufangen.
Bin Ersti in der zweiten Woche ^^
Ergänzung ()

In der ersten Zeile soll eine Null stehen.
In der zweiten Zeile sollen zwei Nullen stehen, also inkrementieren?
In der dritten Zeile sollen drei Nullen stehen. Immer eine Null mehr?
 
Und wie viele Nullen stehen denn in der Zeile 13, wenn wir das Spiel weiter treiben würden?

Abstrahieren und Zusammenhänge verstehen und nutzen. :-)

Dein Ansatz "immer eine Null mehr" ist im Übrigen für den "ersten Wurf" auch vollkommen okay, nur mal so am Rande. Wie würdest du das denn umsetzen? Du könntest dir z.B. merken, wie viele Nullen in der vorherigen Zeile waren.

Es gibt selten nur eine richtige Variante - die Frage ist nur, welche man selbst als am elegantesten ansieht.
 
  • Gefällt mir
Reaktionen: madmax2010
Warum steht die da. Warum wie oft.
Es hilft immer den state des Systems dabei zu betrachten.
Warum wird welche variable wann erhöht. In welchem Zustand sind sie beim aktuellen i,j. Wie sollen sie bei i+1 und j+1 sein und was muss passieren, damit du dahin kommst

Und nuzte hilfsvariablen wann immer du sie brauchst.
 
Grundsätzlich kann man sowas immer mit allen möglichen Herangehensweisen betrachten. Die "Standardlösung" ist sicherlich, die Zeilen / Spalten zu zählen und den Zähler mithilfe des Modulu zu verrechnen.

Wichtiger Hinweis, hier erneut: Modulu
 
  • Gefällt mir
Reaktionen: Bonanca, HeavensBlade, Fusionator und 2 andere
Wie nutzt man denn diese Code Tags hier im Forum?
Hab hier wieder einen Screenshot. Plötzlich hat es funktioniert :schluck:
Als Beispiel sollte die Ausgabe 4 Zeilen haben, ergo z= 4.
0
00
000
0000

Zuerst hatte ich diesen Code:

code3.PNG


Da war sah die Ausgabe aber so aus:
"

0
00
000"

Die erste Zeile war leer, was so nicht sein sollte. Die äußere Schleife beginnt mit i = 0. Die innere Schleife beginnt mit x = 0 und prüft, ob x < i ist. Das war beim ersten Durchlauf der Schleife nicht der Fall (0 < 0, womit die innere Schleife übersprungen wurde und die äußere Schleife mit \n nur den Sprung in die nächste Zeile ausgab.


Dann den Code wie folgt geändert:

code2.PNG


Ausgabe:
"

0
00
000
0000"

Schonmal richtiger, aber immernoch falsch, da die erste Zeile leer ist. Deshalb:

code4.PNG


Der Fehler lag in der Schleifenbedingung der inneren Schleife. x nicht < i sondern x <= i.
Jetzt stimmt es.
In der ersten Zeile steht eine 0 bzw eine Spalte
In der zweiten Zeile stehen zwei 0, bzw zwei Spalten.
Die äußere und innere Schleife zählen sich also gleichzeitig hoch.
Die äußere Schleife startet mit i = 0 und läuft so lange durch, bis die Bedingung i < z nichtmehr erfüllt ist. In dem Fall hier also insgesamt 4 mal, i wird entsprechend jedesmal um eins erhöht. Die innere Schleife bezieht sich entsprechend auf das i, der äußeren Schleife. In der ersten Iteration, wird die innere Schleife einmal ausgeführt, in der zweiten Iteration wird die innere Schleife zweimal ausgeführt usw.

Jetzt bin ich dahinter gestiegen.
Das war aber eine Geburt :D
 
  • Gefällt mir
Reaktionen: Drexel
Code-Tags: "code" in eckigen Klammern, zum Öffnen und schließen.

[ CODE ] und [ /CODE ]
ohne Leerzeichen halt.

gibt
Code:
 und
Man kann da noch mehr machen, aber das ist schon mal das wichtigste...

@andy_0: Warum modulo? Kannst du mir auf die Sprünge helfen?
Da denke ich dann eher an
0
00
000
0000
0
00
000

@Drexel: Zum Glück bist du da, hat außer dir niemand gesehen.
 
Zuletzt bearbeitet:
DaysShadow schrieb:
Der Operator heißt Modulo.

Wichtiger Hinweis, hier erneut: Modulo.

:p
Fair point :)

tollertyp schrieb:
@andy_0: Warum modulo? Kannst du mir auf die Sprünge helfen?
Der TE muss alle x Schleifendurchläufe seine Ausgabe ändern. Mit dem Operator kann er feststellen, in welchem "Durchlauftyp" er sich befindet, egal wie viele Durchläufe er iteriert.
 
Und inwiefern ist das notwendig? Vielleicht soll es ja immer symmetrisch sein, bei 11 Zeilen dann

0
00
000
0000
00000
000000
00000
0000
000
00
0

Aber hey, man kann auch nach dem "You ain't gonna need it"-Prinzip arbeiten, und einfach alles einbauen, egal ob es gefragt ist oder nicht.

Genau deshalb ist es immer wichtig, Aufgaben auch mal in Worte zu fassen, oder nicht nur ein Beispel zu nehmen, aus einem Beispiel geht halt genau eine Sache hervor, aber nicht, was passiert, wenn man an den Rahmenbedingungen was macht.

Inwiefern Modulo ihm jetzt für die Lösung elementar hilft habe ich aber dennoch nicht verstanden.
 
  • Gefällt mir
Reaktionen: Bonanca
Status
Für weitere Antworten geschlossen.
Zurück
Oben