Schleifen einsetzen
-
Hallo.
Ich mache gerade eine Weiterbildung um die Programmiersprache C++ zu erlernen.
In einer Übung sollte ich ein einfaches Programm ohne Schleifen schreiben, das einfach nur die Punktzahlen von 5 Schulaufgaben, welche von 4 Schulklassen gelöst wurden, addieren sollte.Hier der Quelltest vom Programm:
//
/* e1_3 Mathematikwettbewerb */
//
#include <stdio.h>void main (void)
{
float matrix_a [4][5] = {{3, 15, 10, 30, 14},
{16, 12, 12, 24, 8},
{8, 5, 15, 20, 20},
{10, 8, 14, 10, 25}},matrix_b [1][5] = {{3, 2, 1, 2, 3}},
ges_pkte [1][4] = {{0, 0, 0, 0}};
int i = 0;
ges_pkte[0][0]= matrix_a[i][0] * matrix_b[0][0] +
matrix_a[i][1] * matrix_b[0][1] +
matrix_a[i][2] * matrix_b[0][2] +
matrix_a[i][3] * matrix_b[0][3] +
matrix_a[i][4] * matrix_b[0][4];i = 1;
ges_pkte[0][1]= matrix_a[i][0] * matrix_b[0][0] +
matrix_a[i][1] * matrix_b[0][1] +
matrix_a[i][2] * matrix_b[0][2] +
matrix_a[i][3] * matrix_b[0][3] +
matrix_a[i][4] * matrix_b[0][4];i = 2;
ges_pkte[0][2]= matrix_a[i][0] * matrix_b[0][0] +
matrix_a[i][1] * matrix_b[0][1] +
matrix_a[i][2] * matrix_b[0][2] +
matrix_a[i][3] * matrix_b[0][3] +
matrix_a[i][4] * matrix_b[0][4];i = 3;
ges_pkte[0][3]= matrix_a[i][0] * matrix_b[0][0] +
matrix_a[i][1] * matrix_b[0][1] +
matrix_a[i][2] * matrix_b[0][2] +
matrix_a[i][3] * matrix_b[0][3] +
matrix_a[i][4] * matrix_b[0][4];printf("\n\tDie Punkteverteilung fuer alle 4 Klassen:");
printf("\n");
printf("\n\t Nr der Aufg. 1 2 3 4 5 Gesamt Pkt. ");
printf("\n");
printf("\n\t Klasse 8a: %2.0f | %2.0f | %2.0f | %2.0f | %2.0f | %2.0f",
matrix_a[0][0],matrix_a[0][1],matrix_a[0][2],matrix_a[0][3],matrix_a[0][4],ges_pkte[0][0]);
printf("\n");
printf("\n\t Klasse 8b: %2.0f | %2.0f | %2.0f | %2.0f | %2.0f | %2.0f ",
matrix_a[1][0],matrix_a[1][1],matrix_a[1][2],matrix_a[1][3],matrix_a[1][4],ges_pkte[0][1]);
printf("\n");
printf("\n\t Klasse 8c: %2.0f | %2.0f | %2.0f | %2.0f | %2.0f | %2.0f ",
matrix_a[2][0],matrix_a[2][1],matrix_a[2][2],matrix_a[2][3],matrix_a[2][4],ges_pkte[0][2]);
printf("\n");
printf("\n\t Klasse 8d: %2.0f | %2.0f | %2.0f | %2.0f | %2.0f | %2.0f ",
matrix_a[3][0],matrix_a[3][1],matrix_a[3][2],matrix_a[3][3],matrix_a[3][4],ges_pkte[0][3]);
printf("\n");
printf("\n\t Pkt/Aufg.: %2.0f | %2.0f | %2.0f | %2.0f | %2.0f ",
matrix_b[0][0],matrix_b[0][1],matrix_b[0][2],matrix_b[0][3],matrix_b[0][4]);
printf("\n\n");
}
/*************************************************************************************************************/Mit dem Programm bin ich zufrieden, nur jetzt soll ich in dem Programm überall wo es möglich ist Schleifen programmieren. Nachdem ich meine Unterlagen nochmals intensiv durchgearbeitet habe, bin ich darauf gekommen den mittleren Berechnungsteil durch for-Schleifen zu ersetzen. Doch hier liegt mein Problem. Das Programm oben funktioniert doch perfekt ohne Schleifen, warum sollte ich jetzt Schleifen verwenden und vor allem wie? Ich verstehe hier den Zusammenhang nicht, wie ich Schleifen in dem Programm sinnvoll einsetzen kann.

MfG, Patrick
-
Vorteile von Schleifen hier:
- das Programm wird deutlich übersichtlicher
- Du kannst das Programm ganz leicht um eine weitere Klasse/Aufgabe/... erweitern/verkürzen usw.Noch ein paar Anmerkungen:
- Das hier ist reiner C-Code
- Es heißt int main(), nicht void main(void) (das void in der Klammer kann man stehen lassen, macht man aber in neueren C-Versionen nicht mehr)
- Du solltest statt DeinCode lieber schreiben: [cpp][/cpp]
-
Warum? Stell dir vor, noch eine Klasse beantwortet die Fragen. Dann musst du deinen gesamten Code ändern. Stell dir vor, die Berechnung der Gesamtpunktzahl ändert sich. Dann musst du deinen Code an vier Stellen statt an einer einzigen ändern.
Was kann man durch Schleifen ausdrücken? Den mittleren Teil hast du ja bereits erkannt. Aber auch die Ausgabe kann man mit einer Schleife deutlich kürzer gestalten.
Wie? Im mittleren Teil hast du viermal (fast) exakt denselben Code stehen. Das ist dein Schleifenkörper. Wie muss der Kopf aussehen?
-
Das ist ja gerade das Problem, ich weiß nicht wie ich eine Schleife einbringen soll. Ich verstehe den technischen Zusammenhang einer Schleife in diesem Programm nicht, da es ohne ja auch funktioniert.
-
Ja, es funktioniert, allerdings nur mit Code-Wiederholungen (die einzelnen Abschnitte unterscheiden sich nur im Index, auf den zugegriffen wird). Jetzt stell dir mal vor, du mußt eine weitere Klasse oder eine zusätzliche Aufgabe in dem Programm zu ergänzen.
Der erste dürfte es sein, die wiederholten Anweisungsblöcken (ges_punkte[0][i]=... und die printf())durch eine Schleife zu ersetzen, in der zweiten Phase kannst du dann in der Summierung eine Schleife verwenden, um die einzelnen Elemente zu summieren bzw. auszugeben.
PS: Haben diese 1*n Matrizen einen tieferen Sinn? Wenn du eindimensionale Strukturen hast, brauchst du kein 2D Array dafür.
-
PatrickHH schrieb:
Das ist ja gerade das Problem, ich weiß nicht wie ich eine Schleife einbringen soll. Ich verstehe den technischen Zusammenhang einer Schleife in diesem Programm nicht, da es ohne ja auch funktioniert.
Merke: Es gibt immer mehrere Weisen, ein Programm so zu schreiben, dass es funktioniert.
Weißt du nicht, wie du eine Schleife verwenden sollst, oder warum du eine Schleife verwenden sollst?
-
Im Moment weiß ich nicht wie ich hier eine Schleife verwenden soll.
-
Dann schau mal, welcher Code sich in deinem Programm ziemlich ähnlich sieht, bis auf eine oder zwei Zahlen.
Womit lernst du eigentlich C oder C++? Welches Tutorial/Buch?
P.S.: Du solltest deinen Anfangspost editieren und Code-Tags verwenden.
-
CStoll schrieb:
PS: Haben diese 1*n Matrizen einen tieferen Sinn? Wenn du eindimensionale Strukturen hast, brauchst du kein 2D Array dafür.
Das ist gerade der Stand in meiner Weiterbildung, bzw. so wird es mir beigebracht.
-
Du hast doch 4 Blöcke mit verschiedenen Anweisungen. Auch hast du bereits eine Variable (i) definiert. Innerhalb der Blöcke werden Indizes von 0-4 verwendet, also könntest du am Besten zwei (eine Schleife ist geschachtelt) Schleifen wie folgt schreiben:
for(int i=0;i<4;++i)// i im Bereich [0-3] { for(int k=0;k<5;++k)// k im Bereich [0-4] { // Hier einen Block hineinkopieren und die notwendigen Zahlen durch k ersetzen } }Innerhalb der äußeren Schleife wird bei jedem Durchgang die innere Schleife komplett abgearbeit.
Die Ausgabe kann auf ähnliche Weise erfolgen.
Edit: Ich weiß nicht, ob du überhaupt einen C++-Compiler verwendest, falls es ein nicht C99-fähiger Compiler ist, müsstest du die Schleifenvariablen i und k am Scopeanfang deklarieren.
-
PatrickHH schrieb:
CStoll schrieb:
PS: Haben diese 1*n Matrizen einen tieferen Sinn? Wenn du eindimensionale Strukturen hast, brauchst du kein 2D Array dafür.
Das ist gerade der Stand in meiner Weiterbildung, bzw. so wird es mir beigebracht.
Was für eine Weiterbildung? Ich finde es nicht sinnvoll, Leute Dinge so unnötig komisch/unnütz programmieren zu lassen, nur weil man ihnen keine Grundprinzipien beibringt, sondern konkrete Anwendungsfälle.
-
yahendrik schrieb:
Edit: Ich weiß nicht, ob du überhaupt einen C++-Compiler verwendest, falls es ein nicht C99-fähiger Compiler ist, müsstest du die Schleifenvariablen i und k am Scopeanfang deklarieren.
Ich verwende denn gcc-Compiler unter Linux.
Die Weiterbildung mache ich in Form eines Fernstudiums.
-
PatrickHH schrieb:
yahendrik schrieb:
Edit: Ich weiß nicht, ob du überhaupt einen C++-Compiler verwendest, falls es ein nicht C99-fähiger Compiler ist, müsstest du die Schleifenvariablen i und k am Scopeanfang deklarieren.
Ich verwende denn gcc-Compiler unter Linux.
Die Weiterbildung mache ich in Form eines Fernstudiums.
Kauf dir ein Buch/Leih dir eins aus. Z.B. C++ Primer/Die C++ Programmiersprache. NICHT Bücher von Jürgen Wolf!
-
Habe es endlich geschafft das Problem zu lösen. Die perfekte Schleifenanweisung im Bezug auf meine Übung unter den gegebenen Voraussetzungen lautet:
for ( k=0; k<4; k=k+1) { for ( a=0; a<5; a=a+1) { ges_pkte[0][k] += matrix_a[k][a] * matrix_b[0][a]; } }
-
C-Code, C-Compiler, ich glaube der Threadersteller verwechselt C mit C++.
Auch wenn die Frage schon beantwortet ist, verschiebe ich es mal dahin, wo es hingehört.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Noch eine ganz kleine Anmerkung:
Anstatt immer x=x+1 zu schreiben, kannst du auch x++ oder ++x schreiben. Ist nicht so aufwändig. Vor allem praktisch bei längeren Variablennamen.
-
PatrickHH schrieb:
Habe es endlich geschafft das Problem zu lösen. Die perfekte Schleifenanweisung im Bezug auf meine Übung unter den gegebenen Voraussetzungen lautet:
for ( k=0; k<4; k=k+1) { for ( a=0; a<5; a=a+1) { ges_pkte[0][k] += matrix_a[k][a] * matrix_b[0][a]; } }
Super. Und wenn du die 0 auch noch durch eine Schleifenvariable ersetzen würdest, wärst du noch flexibler mit deinem Programmcode.
In eine Funktion kann man sowas auch leicht packen, probiere es mal aus, indem du alle Schleifenendwerte als Parameter an diese Funktion übergibst.
-
SeppJ schrieb:
C-Code, C-Compiler, ich glaube der Threadersteller verwechselt C mit C++.
Auch wenn die Frage schon beantwortet ist, verschiebe ich es mal dahin, wo es hingehört.
Nein, es geht um das Erlernen der Programmiersprache C++. Bin eben noch am Anfang, da sind die Themen für Euch bestimmt noch sehr einfach.
-
Jochen S. schrieb:
Noch eine ganz kleine Anmerkung:
Anstatt immer x=x+1 zu schreiben, kannst du auch x++ oder ++x schreiben. Ist nicht so aufwändig. Vor allem praktisch bei längeren Variablennamen.Das weiß ich, aber zu dem Kapitel müssen wir im Lehrgang noch die kompliziertere Schreibweise nutzen. x++ usw. verwenden wir jetzt erst im neuen Abschnitt.