Funktion einiger Berechnungen erklären

-DarkMan-

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
375
Guten Morgen liebe Computer-Base´ler,

Ich habe hier ein Programm vor mir liegen und würde gerne wissen, wie es denn funktioniert.
Scheint nichts großartiges zu sein, aber könnte mir jemand die Funktion erklären, bzw. wie das Programm vorgeht?

Code:
#include <iostream.h>
#include <conio.h>

void main () {
     int feld[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
     int i, k, *pf = &feld[0][0], *pzei;
     pzei = pf;
     for (i = 0 ; i < 3 ; i++) {
        pf = pf + 3;
        cout << *pf << endl;
        for (k = 3 ; k >= 0 ; k--) {
           feld[i][k] = feld[i][k]+(k*i);
           cout << feld[i][k] << endl;
        };
     };
     cout << *(pzei + 2) << endl;
     getch();
}

Die zahlen, die der Reihe nach ausgegeben werden sind: 3,3,2,1,0,6,10,8,6,4,9,17,14,11,8,2

Grüße

P.S. Meine Vorüberlegung. Es handelt sich hierbei um ein Programm mit 3 Zeilen und 4 Spalten.

0 1 2 3
4 5 6 7
8 9 10 11
 
Zuletzt bearbeitet:
Keine Hausaufgabenhilfe im Forum.
Bei konkreten Problemfragen helfen wir gerne weiter aber das klingt sehr nach: macht mir meine Arbeit.
 
Hausaufgaben?

Die Funktion ist gegeben und die Lösungen entsprechend dazu.
Nach Hausaufgaben würde es doch mehr klingen, wenn eines dieser beiden Dinge fehlen würde oder? ;)

Ich programmiere derzeit etwas aus Zeitvertreib, diese Funktion habe ich in meinen Unterlagen gefunden und konnte sie nicht wirklich nachvollziehen.

Falls du mir nicht glaubst, hier ein Teil meines Programm, was die Mittelwerte eines Behälters ausrechnet, an jeweils 3 verschiedenen Stellen, aus 12 Messpunkten. Ziemlich simpel im Gegensatz zum ersten Beispiel. Kann dir noch mehr liefern wenn du mir nicht glaubst :)
Code:
#include <iostream>
using namespace std;
int main ()
{
     float top_line;
     float mid_line;
     float bot_line;
     
     Gesamt_top = (top_line)/12
     Gesamt_mid = (mid_line)/12
     Gesamt_bot = (bot_line)/12     
          
     cout << "Mittelwert am Boden:" << Gesamt_bot << endl;
     cout << "Mittelwert in der Behaeltermitte:" << Gesamt_mid << endl;
     cout << "Mittelwert am Deckel:" << Gesamt_top << endl;
     
     getchar();
     return 0;
}
 
Zuletzt bearbeitet:
Woran genau scheitert es denn bei dem Verständnis des Programms?
Welche Zeile oder welche Schleifeniteration verstehst du nicht?
 
Also ich verstehe nicht, was du von uns willst.
Das von dir gepostete Programm ergibt (für mich) ohne Kontext (und wahrscheinlich auch mit) absolut keinen Sinn.
Ausserdem hast du es selbst geschrieben. Du solltest doch wissen wie man den Code liest. Wozu es war kannst nur du wissen.
 
Raybeez schrieb:
Woran genau scheitert es denn bei dem Verständnis des Programms?
Welche Zeile oder welche Schleifeniteration verstehst du nicht?

Das kleine Programm in meinem ersten Post gibt Zahlen aus.
Ich weiß nicht, wie der Vorgang dabei aussieht und würde diesen gerne verstehen.
Zeile 6 - 12 bereitet mir unverständnis.
 
Zuletzt bearbeitet:
Was möchtest du eigentlich genau wissen? Was das Programm da berechnet oder wie es das macht?

Machen wir den Code erstmal halbwegs lesbar und sorgen dafür, dass er überhaupt compiliert und lauffähig ist. Das ist kein C++, sondern ein Fall für den Europäischen Gerichtshof für Menschenrechte.

Code:
#include <iostream>
int main (int argc, char** argv) {
  int feld[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
  for (size_t i = 0; i < 3; i++) {
    std::cout << feld[3 * i] << std::endl;
    for (size_t k = 0; k < 4; k++) {
      feld[4 * i + k] += k * i;
      std::cout << feld[4 * i + k] << std::endl;
    }
  }
  std::cout << feld[2] << std::endl;
}

Anhand der Zeile 7 (lies 4*i+k als [k]) sollte halbwegs klar werden, was da passiert.

Die Zahlenfolge, die das ursprüngliche Programm ausgibt, hat wahrscheinlich keine sinnvolle Bedeutung, daher dürfte es nicht sonderlich schlimm sein, dass die hier teilweise anders herum ausgegeben wird. Du kannst dir das Feld vorher und nachher ja auch mal zeilenweise ausgeben lassen.
 
Zuletzt bearbeitet:
Tut mir leid, ich möchte natürlich wissen wie das Programm hierbei vorgeht.

Es wäre schön anzusehen anhand eines Beispiels mit der ersten Nummer (3).
 
"Natürlich" ist bei dem Programm gar nichts :freak:
Da muss man sich einfach mal anschauen, was das Programm denn macht, bevor es die erste Zahl ausgibt.

Code:
     int feld[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
     int i, k, *pf = &feld[0][0], *pzei;
     pzei = pf;
     for (i = 0 ; i < 3 ; i++) {
        pf = pf + 3;
        cout << *pf << endl;  // Hier findet die Ausgabe statt
[/code]

Jetzt schaust du dir von unten nach oben an, welche Variablen beteiligt sind. Da wäre pf - der Zeiger, der da dereferenziert wird.

Wo wird pf zuletzt geändert? Direkt in der Zeile dadrüber. Und zwar genau ein Mal, weil wir ja von der ersten Zahl reden.
Auf welche Addresse zeigt pf nun? Auf die alte Addresse + 3 * sizeof(int).

Welche ist die alte Addresse? Nun, da muss man dann wieder schauen, wo pf zuletzt verändert wurde. Offensichtlich bei der Initialisierung:
Code:
int *pf = &feld[0][0]
pf zeigt also erst auf den Anfang des Feldes und nach der Addition auf das Element 3 des Feldes. Und da steht die 3 drin, daher ist *pf während der Ausgabe = 3.


Und das ganze machst du für alle anderen Zahlen auch. Kleiner Tip: Wenn du solche kleinen Programme durcharbeitest, such dir am besten welche aus, die halbwegs mit Hirn programmiert wurden und die auch etwas tun, was in irgendeiner Weise Sinn ergibt (z.B. irgendwelche mathematischen Dinge ausrechnen).
 
VikingGe schrieb:
"Natürlich" ist bei dem Programm gar nichts :freak:
Da muss man sich einfach mal anschauen, was das Programm denn macht, bevor es die erste Zahl ausgibt.

Code:
     int feld[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
     int i, k, *pf = &feld[0][0], *pzei;
     pzei = pf;
     for (i = 0 ; i < 3 ; i++) {
        pf = pf + 3;
        cout << *pf << endl;  // Hier findet die Ausgabe statt
[/code]

Jetzt schaust du dir von unten nach oben an, welche Variablen beteiligt sind. Da wäre pf - der Zeiger, der da dereferenziert wird.

Wo wird pf zuletzt geändert? Direkt in der Zeile dadrüber. Und zwar genau ein Mal, weil wir ja von der ersten Zahl reden.
Auf welche Addresse zeigt pf nun? Auf die alte Addresse + 3 * sizeof(int).

Welche ist die alte Addresse? Nun, da muss man dann wieder schauen, wo pf zuletzt verändert wurde. Offensichtlich bei der Initialisierung:
Code:
int *pf = &feld[0][0]
pf zeigt also erst auf den Anfang des Feldes und nach der Addition auf das Element 3 des Feldes. Und da steht die 3 drin, daher ist *pf während der Ausgabe = 3.


Und das ganze machst du für alle anderen Zahlen auch. Kleiner Tip: Wenn du solche kleinen Programme durcharbeitest, such dir am besten welche aus, die halbwegs mit Hirn programmiert wurden und die auch etwas tun, was in irgendeiner Weise Sinn ergibt (z.B. irgendwelche mathematischen Dinge ausrechnen).

Perfekt erklärt, genau das wollte ich. Sehr schön, jetzt kann ich es mir in Ruhe anschauen.
Das Programm wurde von meinem Prof programmiert, einfach als kleines Beispiel :D
 
Aha ... also doch für die Uni.

​Aber trotzdem eine Empfehlung: Wechsel die Uni oder mindestens den Prof, wenn das wirklich von einem ist!
 
Fangen wir mal bei der Variablenbenennung an.
​Und dann gehts mit fehlenden ​Kommentaren weiter (falls das keine Aufgabe sondern ein wirkliches Anschauungsbeispiel sein sollte).

​Ich frage mich was der Prof damit beibringen wollte. Es gibt mMn definitiv anschaulichere Anwendungsbeispiele für For Loops, Arrays etc um es jemanden beizubringen. Denn darum geht's ja schließlich in der Uni.
 
Zuletzt bearbeitet:
Wieso denn beibringen kann genauso die "Freizeitbeschäftigung" aka Hausaufgabe / Übungsaufgabe sein die man halt auch an der Uni noch haben kann.
 
Ich zitiere mal :
-DarkMan- schrieb:
Hausaufgaben?

Die Funktion ist gegeben und die Lösungen entsprechend dazu.
Nach Hausaufgaben würde es doch mehr klingen, wenn eines dieser beiden Dinge fehlen würde oder? ;)

Ich programmiere derzeit etwas aus Zeitvertreib, diese Funktion habe ich in meinen Unterlagen gefunden und konnte sie nicht wirklich nachvollziehen.

-DarkMan- schrieb:
Das Programm wurde von meinem Prof programmiert, einfach als kleines Beispiel :D
 
Wenn du verstehen willst wie ein Programm abläuft, dann schnapp die mal einen Debugger. Da kannst du Zeile für Zeile durchgehen und beobachten was das Programm macht. Bei den meisten werden die Variablen direkt hervorgehoben, die in einem Schritt geändert wurden usw.

Dann nimm erst ein Programm was du schon verstanden hast um dich mit dem Debugger vertraut zu machen. Wenn du damit die Funktionsweise des Debuggers verstanden hast kannst du den einfach auf jedes Programm anwenden. Das ist kein Hexenwerk und es ist schnell angelesen und hilft Anfängern imho ungemein den Programmablauf zu verstehen. Falls du das wirklich machen willst noch ein paar Begriffe mit denen du da voran kommst: Breakpoints, Step Over, Step Into.
 
Ja ein Programm, welches von meinem Professor programmiert wurde, mit Ergebnissen.
Wo ist da die Hausaufgabe?

Ich versuche es nachzuvollziehen und verstehe es nicht, frage hier bei Personen an, die es mir erklären können.
Wie sonst soll ich es nachvollziehen können ohne zu fragen?

Wie du schon erwähnt hast, das Beispiel ist nicht gerade gut, wir wurden einfach "ins kalte Wasser geschubst"....
Deswegen tu ich mir da auch so schwer.
 
Zurück
Oben