Forum: PC-Programmierung Mehrdimensionale Vektoren


von MrTonnu (Gast)


Lesenswert?

Hallo,

ich bin zufällig auf diese Seite gestoßen und hoffe ihr könnt mir bei 
einer Aufgabe helfen.

Und zwar muss ich ein Programm schreiben, welches Zufallszahlen 
generiert, diese in einem Vektor speichert und ausgibt.

Die Zahlen sollen in einem zweidimensionalem Vektor abgelegt werden (zum 
Beispiel so):
int puffer[5][2]={{1, 9},{2, 30},{3, 22},{4, 54},{5, 7}}

Und dann soll das Programm dies ausgeben.

Zufallszahlen generieren mach ich so:
1
int main(void)
2
{
3
  int i, j;
4
5
  j = 5;                     //5 Zahlen werden ausgegeben
6
7
    srand (time(NULL));
8
    for (i=0 ; i< j ; i++)
9
    {
10
        printf("Zufallszahl: %d\n", rand()%1000);
11
    }
12
    return 0;
13
14
}

Leider komm ich bei dieser Aufgabe nicht weiter und hoffe auf einen 
kleinen Denkanstoß.

Liebe Grüße

von Dussel (Gast)


Lesenswert?

Anscheinend ist die Anzahl der Zahlen vorher klar.
Einer Variable kann man den Zufallswert mit
1
int a=rand()%1000;
zuweisen.
Einem Element in einem Array, deinem 'Vektor' kann man mit
1
Puffer[x][y]=var;
einen Wert zuweisen.
Der Zugriff auf die einzelnen Elemente geht über zwei verschachtelte 
Schleifen oder indem direkt in einem Schleifendurchlauf beide Felder in 
der 'Zeile' des Vektors zugewiesen werde.

von MrTonnu (Gast)


Lesenswert?

Bei dem Beispiel habe ich vorher nur getestet, wie man Zahlen zufällig 
generiert (in dem Fall Zahlen bis 1000).
Leider komm ich trotzdem nicht weiter. Habe aber noch im Internet etwas 
über malloc gefunden.

von Dussel (Gast)


Lesenswert?

Dann schreib mal, wo du nicht weiterkommst. Wie Schleifen funktionieren, 
man Zufallszahlen erzeugt und wie man ein Array anlegt, weißt du 
anscheinend, wie man dann auf die Arrayelemente zugreift, habe ich 
geschrieben. Das ist alles, was man für die Aufgabe braucht.

von Lehrerin (Gast)


Lesenswert?

MrTonnu schrieb:
> Die Zahlen sollen in einem zweidimensionalem Vektor abgelegt werden (zum
> Beispiel so):
> int puffer[5][2]={{1, 9},{2, 30},{3, 22},{4, 54},{5, 7}}

Das ist kein zweidimensionaler Vektor. Ein zweidimensionaler Vektor hat 
genau 2 Komponenten.

> Leider komm ich bei dieser Aufgabe nicht weiter und hoffe auf einen
> kleinen Denkanstoß.

Ein Denkanstoß wäre, die Klasse zu wieder holen. Oder zwei. Oder ein 
paar mehr.

von Dirk B. (dirkb2)


Lesenswert?

Lehrerin schrieb:
> Das ist kein zweidimensionaler Vektor.
Was ist es dann?

von Troll (Gast)


Lesenswert?

Hör nicht auf den Troll - es ist sehr wohl ein zweidimensionales Array 
(du studierst sicher an einer Hochschule oder? Denn Vektor nennt das 
sonst eigentlich niemand :))

von MrTonnu (Gast)


Lesenswert?

Genau, wiederholen wird ebenso schwer, wenn man Informatik zum ersten 
Mal macht.

Ein Array wäre doch:
1
int arr[5][2];

Der Zugriff erfolgt damit:
1
Puffer[x][y]=var;


Meinen Zufallswert bekomme ich durch:
1
int a=rand()% 1000

Ebenso muss ich for-Schleifen verwenden, damit mein Array die Werte 
bekommt:
1
for (i = 0, i = j, i++);

Irgendwie bin ich so durcheinander, dass ich keine sinnvolle Funktion 
aufstellen kann.

von MrTonnu (Gast)


Lesenswert?

Jetzt hab ich schonmal einen kleinen Ansatz, jedoch falsch..
1
int main(void)
2
{
3
  int i,j;
4
  int arr[2][5];
5
6
  for(i = 0; i < 2; i++) //
7
    for(i = 0; i < 5; i++)
8
        printf("Index[%d]: Zufallszahl %d\n", i, arr[2]); // Array anzeigen
9
10
      return 0;
11
}

Die Ausgabe ist diese:
Index[0]: Zufallszahl 2673692
Index[1]: Zufallszahl 2673692
Index[2]: Zufallszahl 2673692
Index[3]: Zufallszahl 2673692
Index[4]: Zufallszahl 2673692

Wie füge ich das jetzt mit meiner Zufallszahl hinzu?

von Dussel (Gast)


Lesenswert?

Ich würde das erstmal 'eindimensional' machen. Was musst du tun?

Mehrmals (in einer Schleife)
1. Zufallszahl erzeugen
2. An der richtigen Stelle ins Array einfügen

Danach, wieder mit einer Schleife
4. Die Zahlen nacheinander ausgeben.


In deinem Beispiel greifst du immer auf das gleiche Arrayelement zu und 
hast in beiden Schleifen die gleiche Variable.

von MrTonnu (Gast)


Lesenswert?

Wenn ich mein Programm so schreibe:
1
int main(void)
2
{
3
  int i,j;
4
  int arr[2];
5
6
  srand(time(NULL));
7
  for(i = 0; i < j; i++)
8
  {
9
    printf("Index: %d\n", rand()%1000);
10
  }
11
12
      return 0;
13
}

komme ich in eine Endlos-Schleife

von Gerd (Gast)


Lesenswert?

Geh das Programm mal Schritt Für Schritt durch
und schreibe für jeden Schritt alle Variablen und
deren Werte auf und was passieren soll:

Start:
i = []
j = []
arr = [][]

Zuweisung
j = 5

for-Schleife betreten, Zuweisung
i = 0

prüfen i < j ?
0 < 5

Bedingung erfüllt, Schleifenrumpf betreten
[Was muss hier jetzt passieren?]

i um eins erhöhen
i=1;

prüfen i < j ?
1 < 5

Schleifenrumpf erneut betreten
[...]

von Dussel (Gast)


Lesenswert?

Teilaufgaben:
1. Wie erstellt man eine Schleife mit einer bestimmten Anzahl an 
Durchläufen? (Ist ja oben schon teilweise gelöst)
2. Wie weist man in der Schleife jedem Feld eines Arrays einen Wert zu?
3. Wie macht man das gleiche bei einem mehrdimensionalen Feld?

Probier das mal nacheinander aus und berichte. Davon abgesehen ist j 
nicht initialisiert.

von Dirk B. (dirkb2)


Lesenswert?

Troll schrieb:
> Denn Vektor nennt das
> sonst eigentlich niemand :))

Das heißt so in der ersten Auflage vom K&R. Zumindest im deutschen.

von Dirk B. (dirkb2)


Lesenswert?

MrTonnu schrieb:
> Jetzt hab ich schonmal einen kleinen Ansatz, jedoch falsch..
>
>
1
int main(void)
2
> {
3
>   int i,j;
4
>   int arr[2][5];
5
> 
6
>   for(i = 0; i < 2; i++) //
7
>     for(i = 0; i < 5; i++)
8
>         printf("Index[%d]: Zufallszahl %d\n", i, arr[2]); // Array 
9
> anzeigen
10
> 
11
>       return 0;
12
> }
>
> Die Ausgabe ist diese:
> Index[0]: Zufallszahl 2673692
> Index[1]: Zufallszahl 2673692
> Index[2]: Zufallszahl 2673692
> Index[3]: Zufallszahl 2673692
> Index[4]: Zufallszahl 2673692
>
> Wie füge ich das jetzt mit meiner Zufallszahl hinzu?

Du hast zwei inneinander verschachtelte Schleifen mit derselben 
Laufvariable.
Du greifst auf ein Zweidimensionales Array nur mit einer Dimension zu.
Du achtest nicht auf Warnungen vom Compiler.

Du hast Arrays (auch eindiminsonale) nicht verstanden.
1
#define ANZAHL 5
2
int main(void)
3
{
4
  int arr[ANZAHL];
5
6
  for(int i = 0; i < ANZAHL; i++) //
7
    arr[i] = rand();  // Array mit zufallszahlen füllen
8
9
10
  for(int i = 0; i < ANZAHL; i++) //
11
    printf("Index[%d]: Zufallszahl %d\n", i, arr[i]); // Array anzeigen
12
13
  return 0;
14
}

von MrTonnu (Gast)


Lesenswert?

1
#define Puffergroesse 128
2
#define spalte1 0
3
#define spalte2 1
4
5
void qs(int num[][dim2], int unten, int oben) {
6
  int i, j;
7
  long int mitte, puffer[Puffergroesse][dim2] = { { 0 } };
8
9
  i = unten;
10
  j = oben;
11
  mitte = num[(unten + oben) / 2][spalte2]; // mittleres Element
12
13
  do {
14
    while (num[i][spalte2] < mitte && i < oben)
15
      i++; // such Element f¸r "grofle Klasse"
16
    while (mitte < num[j][spalte2] && j > unten)
17
      j--;     // such Element f¸r "kleine Klasse"
18
19
    if (i <= j) {
20
      puffer[0][spalte2] = num[i][spalte2];
21
      puffer[0][spalte1] = num[i][spalte1];
22
      num[i][spalte2] = num[j][spalte2];
23
      num[i][spalte1] = num[j][spalte1];
24
      num[j][spalte2] = puffer[0][spalte2];     // vertausche Elemente
25
      num[j][spalte1] = puffer[0][spalte1];
26
      i++;
27
      j--;
28
    }
29
  } while (i <= j);
30
31
  if (unten < j)
32
    qs(num, unten, j);            // Aufruf f¸r "kleine Klasse"
33
  if (i < oben)
34
    qs(num, i, oben);  // Aufruf f¸r "grofle Klasse"
35
}
36
37
int main(void) {
38
  int i, x, j;
39
  int num[dim1][dim2];
40
  time_t t;
41
42
  srand((unsigned) time(&t));
43
//Array zuweisen
44
  for (i = 0; i < dim1; i++) {
45
    for (j = 0; j < dim2; j++) {
46
      if (j == 0) {
47
        num[i][j] = i + 1;
48
      } else {
49
        x = rand() % 1000;
50
        num[i][j] = x;
51
      }
52
    }
53
  }
54
55
  qs(num, 0, dim1 - 1);
56
57
//Ausgabe
58
  printf("\tIndex\tZufallszahlen\n");
59
  for (i = 0; i < dim1; i++) {
60
    for (j = 0; j < dim2; j++) {
61
      printf("\t%d", num[i][j]);
62
    }
63
    printf("\n");
64
  }
65
}

Ich hab es tatsächlich geschafft diese Aufgabe zu lösen. Danke für die 
super Hilfe. Nun wollte ich noch fragen, da ich die zweite Spalte 
sortieren muss, muss ich dafür eine Quicksort Funktion hinzufügen (diese 
habe ich so bekommen). Leider komme ich nicht ganz dahinter was ab 'do' 
passiert. Ich versuche es mal:
1
do {
2
    while (num[i][spalte2] < mitte && i < oben)
3
      i++; // such Element f¸r "grofle Klasse"
Tue dies solange die 'Num[i]' kleiner ist als 'Mitte' und 'i' kleiner 
'oben. Zähle zu 'i' einen "dazu" ('i++').
1
while (mitte < num[j][spalte2] && j > unten)
2
      j--;     // such Element f¸r "kleine Klasse"
Tue dies solange 'Mitte' kleiner als 'Num[j] und 'j' größer als 'unten'. 
Zieh von 'j' ab ('j--').
1
if (i <= j) {
2
      puffer[0][spalte2] = num[i][spalte2];
3
      puffer[0][spalte1] = num[i][spalte1];
4
      num[i][spalte2] = num[j][spalte2];
5
      num[i][spalte1] = num[j][spalte1];
6
      num[j][spalte2] = puffer[0][spalte2];     // vertausche Elemente
Das hier kann ich mir nicht erklären..

Und noch was: Wie kann ich das verstehen? Hatte das so leider aus dem 
Internet
1
srand((unsigned) time(&t));

Vielen Dank an alle.
LG MrTonnu

von Dussel (Gast)


Lesenswert?

Ehrlich gesagt, bin ich positiv überrascht. Ich hatte erst den Eindruck, 
dass du nur einen Dummen suchst, der dir die Hausaufgaben macht.

Ich kann jetzt nicht durch den ganzen Code durchsteigen, aber mal eine 
kurze Hilfe, wie Quicksort funktioniert und es anscheinend hier 
umgesetzt wurde:

Man sucht sich ein beliebiges Element und sortiert alle Elemente, die 
kleiner sind nach links und alle die größer sind, nach rechts. Das 
'Trennelement' (Pivotelement) setzt man dazwischen. Dann hat man
{Kleinere Elemente},Pivot,{Größere Elemente}
Das gleiche kann man für {Kleinere Elemente} und {Größere Elemente} 
wieder machen und bekommt so immer kleinere sortierte Einzelarrays.
Das ganze wird hier rekursiv gemacht, also so, dass man die 
Sortierfunktion für die vorsortierten Einzelarray wieder aufruft.

Das Umsortieren kann man machen, indem man von links so lange durch das 
Array geht, bis man ein größeres Element gefunden hat und von recht so 
lange, bis man ein kleineres Element gefunden hat. Die beiden vertauscht 
man dann. Damit ist sichergestellt, dass sich amlinken Rand nur kleinere 
Elemente und am rechten Rand nur größere Elemente befinden.

von MrTonnu (Gast)


Lesenswert?

Vielen Dank für deine Antwort. Nein, hatte wie gesagt einen Aussetzer 
und kam einfach nicht auf die Lösung. Jetzt, nach intensivem Lernen und 
probieren, stellt man fest wie einfach das doch eigentlich war. Wohl 
typisches Programmier-Anfänger-Problem :D

Also nochmal Danke für die Erklärung!

von JB (Gast)


Lesenswert?

>Wohl typisches Programmier-Anfänger-Problem :D

Vor allen wirst du das nie wieder vergessen, du hast das GELERNT. Als 
guter Programmierer muss man sich seinem Unwissen und Unvermögen 
stellen, den Kampf gewonnen lacht man nur über neue Syntaxen / 
Programmierparadigmen...
Sehr gut gemacht!

Gruß J

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.