C: Bestimmtes Element aus Array löschen

Neue Frage »

Auf diesen Beitrag antworten »
nano99 C: Bestimmtes Element aus Array löschen

Meine Frage:
Hi!

Ich versuche gerade, ein Programm zu programmieren, das Quartettkarten verteilt.
Ich kann soweit alles, aber ich habe noch 2 offene Fragen dazu:

Ich habe ein int-Array (int zahlen=11,12,13,14,21,22,23,24Augenzwinkern

1. Jetzt möchte ich ein zufälliges Element aus diesem Array nehmen. Ich will also eine Zufallszahl zwischen 0 und sizeof(zahlen)-1 generieren (Ganzzahl).
2. Die generierte Zahl soll nun als Element im Array gelöscht werden.
also z.B.:
int zufallszahl=2; //Nur mal so, ich weiß ja nicht, wie man Zufallszahlen macht
loeschenausarray(zahlen[zufallszahl]); //Das jeweilige Element soll also gelöscht werden.

Die Position im Array soll jedoch nicht einfach leer gemacht werden, sondern komplett gelöscht werden!

Meine Ideen:
zu 1.:
Ich habe gehört, dass es eine Funktion ("rand()" oder "srand()") für Zufallszahlen gibt. Man soll auch irgendwie die Zeit miteinbringen.

Sonst habe ich keine Ahnung!
:-)
großes Grinsen
 
Auf diesen Beitrag antworten »
Karlito

Hallöchen,

schön mal wieder von Dir zu hören.

Zu 1.:
Das Beispiel unter http://www.cplusplus.com/reference/clibrary/cstdlib/rand/ kannst Du dir ja mal anschauen. Du musst nur den Wertebreich deinen Anforderungen entsprechend anpassen. Hier ist von 1 - 9 gewählt. Kennst du die Modulo-Operation? Wenn nicht, schau sie dir an oder frag noch mal nach.

Zu 2.
Aus einem Array Löschen ist nicht ganz so einfach. Da schreibe ich Dir morgen oder übermorgen noch mal dazu. Da muss ich mir ein paar Code-Beispiele ausdenken, damit du verstehst, wie das funktioniert, ohne dass ich viel Text schreibe. Dazu ist es mir heute zu spät Augenzwinkern

VG,

Karlito
Auf diesen Beitrag antworten »
Karlito

Hallo nano99,

Du weist ja vielleicht, dass ein Array in C immer die selbe Länge hat.

Du deklarierst also ein Array z.B. mit:
code:
1:
2:
3:
int test[5];


Und es hat immer die Länge 5. Es gibt auch noch andere Varianten, aber das ist ein wenig schwerer zu verstehen.

Was Du nun machen kannst um ein Element im Array zu löschen ist, dass du dir die Größe des Arrays in einer weiteren Variable merkst. Bsp:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
#include<stdio.h>
#include<stdlib.h>

#define LEN 10

void print_array(int array[], int length){
	int index = 0;
	if (length==0){
		printf("leer!");
		return; //verlasse Methode wenn Array leer
	}

	printf("%d", array[0]);

	for(index = 1; index < length; index++){
		printf(", %d", array[index]);
	}
	printf("\n");
}

//element == element index, deswegen mit 0 beginnend
void delete(int array[], int *len, int element){
	int index = 0;

	if(element+1==*len){
		--*len;
		return;
	}

	//alle Elemente hinter dem zu löschenden Element
	//werden um 1 nach vorn kopiert und überschreiben 
	//das gewünschte Element
	for(index = element; index < *len-1; index++){
		array[index] = array[index + 1];
	}

	//anschließend wird die Länge um 1 "verkürzt"
	--*len;
}

main(int argc, char **argv){
	int array[LEN];
	int length = LEN;
	int index = 0;

	for(index = 0; index < length; index++){
		array[index] = index;
	}
	
	print_array(array, length);

	delete(array, &length, 3); //Löscht das vierte Element aus dem Array
	
	print_array(array, length);

	return EXIT_SUCCESS;
}


Ich hoffe der Code macht dir den Prozess verständlich. Sag bescheid, wenn noch was unklar ist.

VG,

Karlito
Auf diesen Beitrag antworten »
nano99 C: Element aus Array löschen

Hi!

Erstmal vielen Dank für den ganzen Code!
Ich habe für mein fertiges Programm deine Funktionen verwendet, und alles funktioniert einwandfrei! WOW!
Hier nochmal mein fertiges Programm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void print_array(int array[], int length)
{
 int index = 0;
 if (length==0)
 {
  printf("leer!");
  return;
 }
 printf("%d", array[0]);
 for(index = 1; index < length; index++)
 {
  printf(", %d", array[index]);
 }
}

void delete(int array[], int *len, int element)
{
 int index = 0;
 if(element+1==*len)
 {
  --*len;
  return;
 }

 for(index = element; index < *len-1; index++)
 {
  array[index] = array[index + 1];
 }
 --*len;
}
int main()
{
 int karten[8]={11,12,13,14,21,22,23,24};
 int length=8;
 int spieler1[4];
 int spieler2[4];
 int zufall, i, j;
 int kartenanzahl=8;
 srand( time(NULL) );
 for(i=0; i<=3; i++)
 {
  zufall=rand() % kartenanzahl;
  spieler1[i]=karten[zufall];
  delete(karten,&length,zufall);
  kartenanzahl--;
  zufall=rand() % kartenanzahl;
  spieler2[i]=karten[zufall];
  delete(karten,&length,zufall);
  kartenanzahl--;
 }
 printf("Zahlen von Spieler 1: ");
 print_array(spieler1,4);
 printf("\nZahlen von Spieler 2: ");
 print_array(spieler2,4);

 return 0;
}


Also: Danke für deine Hilfe! Augenzwinkern
 
Auf diesen Beitrag antworten »
Karlito

Hallo nano.

Bitte, gerne. Ich hoffe Du hast den Code auch nachvollzogen.

Wenn Du genau hinschaust, ist die Stelle
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
 ...
 if(element+1==*len)
 {
  --*len;
  return;
 }
 ...


überflüssig, da sie in der darauffolgenden Schleife eh noch mal abgefangen wird (die schleife wird nicht ausgeführt)

Weiter so!

VG,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »