Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Belegung eines Feldes auslesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
25.12.2003, 21:24 Uhr
0xdeadbeef
Gott
(Operator)


Na, Pablo, etwas gestresst? Sei nicht so streng, ist doch Weihnachten...

@Neuling: Der Code, den du hast, ist ziemlich merkwürdig. Ich gehe davon aus, dass er auch genau das sein soll, damit du die Auswirkungen im einzelnen verstehst. Ich versuchs mal, so gut wie möglich zu erklären:

C++:
int f (int x, int *y)


Das deklariert eine Funktion f, die eine Zahl als ersten Parameter und einen Zeiger auf eine Zahl als zweiten entgegennimmt. Ich nehme an, was ein Pointer ist, ist bekannt? Der Sinn dahinter ist in diesem Fall ein handgemachtes call-by-reference. Wenn du später f(a[ i ], &a[j]) aufrufst, kann f den Wert von a[j] direkt verändern.

C++:
{
  int z; /* Code einrücken guuut, weil übersichtlich */

  z = (x + *y) % 5;


Hier wird der spätere Rückgabewert ausgerechnet - erster Parameter plus Inhalt des zweiten Parameters modulo 5. In deinem Programm heißt das (a[ i ] + a[j]) % 5.

C++:
  *y = x:
  return (z);
}


Bedeutet soviel wie a[j] = a[ i ]. Funktioniert nur, weil a[j] per Referenz übergeben wird.

Wenn man das ganze inline auflöst, sieht das so aus:

C++:
int main () /* <-- main ist per Konvention immer int */
{ /* <-- Tipfeeler: Falsche Klammer*/
  int i, j, a[5] = {2,1,4,0,3}; /* <-- Hier fehlte ein Komma. */

  for (i = 0; i<5; i++)
  {
    j = a[ i ];
    a[ i ] = (a[ i ] + a[j]) % 5;
    a[j] = j; /* <-- j hat den alten Wert von a[ i ] */
  }

  return 0; /* <-- eingefügt, der Form halber. 0 als Rückgabewert von main heißt, alles ist gut gelaufen */
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.12.2003, 21:27 Uhr
0xdeadbeef
Gott
(Operator)


@kronos: Schau mal genauer hin. Die Zeile

C++:
*y = x;


ist nicht irrelevant. Das ist ein call by reference, der es f erlaubt, a[j] zu ändern. Deswegen wird j auch nicht 2, 1, 4, 0, 3 annehmen. Die Tabelle sollte unser Neuling, denke ich, aber selbst aufstellen - damit sich auch ein Lerneffekt einstellt
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.12.2003, 23:43 Uhr
~Neuling
Gast


Danke erstmal bis hierher für die Erklärung.
Den Sinn und den Code habe ich verstanden. Trotzdem habe ich noch große Probleme. Ich komme nicht auf die Werte die in der Lösungstabelle angegeben werden.
Könnte mir jemand die Werteübernahme für i=0 erklären. Den Rest der Tabelle kann ich ja dann selbst durchdenken, dann habe ich auch den noch besseren Lerneffekt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
26.12.2003, 20:18 Uhr
kronos
Quotenfisch
(Operator)


upsi, 60kkk hat natürlich recht, was den pointer betrifft.

das sind die werte für i=0

C++:
int f (int x, int *y)  // x = 2, y = die addresse von a[2] (inhalt: 4)
{
int z;
z= (x + *y) % 5; // z = ( 2 + inhalt von y )%5 = (2+4)%5 = 1
*y=x: // a[2] = 2
return (z); // gib 1 zurück
}

void main ()
[
int i,j a[5] = {2,1,4,0,3};

for (i=0; i<5; i++) // hier geht's los <--------
{
j=a [i]; // j = 2
a[i] = f (a [i], &a [j]; // a [0] = 1
}
// die neue feldbelegung: a[]={1,1,2,0,3)
}



was für eine ausbildung machst du denn??
ist stressig sowas im kopf zu mache und vor allem sinnlos, wie ich finde.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
26.12.2003, 23:43 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich so ne Aufgabe hätte, würde ich am Ende jedes Schleifendurchlaufs das ganze Feld ausgeben lassen...damit hättest du deine Werte-Tabelle....
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: