dynamische Felder, Felder mit Daten belegen

jenny1106

Grünschnabel
Hallo zusammen!

ich haben einen Teil eines C-Programms vorgegeben:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/*Daten von erbrachten sportlichen Leistungen*/
typedef struct {
double laufen_100m; /*in Sekunden*/
double weitsprung; /*in Metern*/
} Leistungen;

/*Daten eines Schuelers*/
typedef enum {M,F} Geschlecht;

typedef struct {
char name[50];
char gruppe;
Geschlecht g;
Leistungen l;
} Schueler;

int main (void)
{
int num;
Schueler* f;

printf("Bitte geben Sie die Anzahl der Schueler ein!\n"); /*1. Anweisung (siehe unten)*/
scanf("%d", &num);

/*hier sollen weitere C-Anweisungen eingefügt werden*/

return 0;
}

Ich soll nun weitere C-Anweisungen in das Programm integrieren.
1. Die Anzahl der Schüler soll von der Standardeingabe eingelesen und in der Variablen num gespeichert werden
2. Die Zeigervariable f soll mit der Startadresse eines dynamisch angelegten Feldes belegt werden, welches die Daten für num Schüler aufnehmen kann.
3. Der Schüler Lukas aus Gruppe H hat für 100 Meter 20.21 Sekunden gebraucht und ist nur 1.45 Meter weit gesprungen. Seine Daten sollen im letzten Eintrag des Feldes f abgespeichert werden.
4. Die besten Leistungen erbrachte die Schülerin Margarete aus Gruppe A: Sie ist 7.55 Meter weit gesprungen und hat die 100 Meter in 9.5 Sekunden absolviert. Ihre Daten sollen im ersten Eintrag des Feldes f abgelegt werden.

Die erste Anweisung habe ich bereits integriert aber bei den anderen dreien komme ich absolut nicht weiter.
Wie lege ich ein dynamisches Feld an? Wie kann ich die Daten der Schüler in den Feldern abspeichern und wie genau schaffe ich es, dass die Daten bestimmten Felder zugeordnet werden?

Ich hoffe, dass ich mir weiterhelfen könnt. Das Thema ist absolut klausurrelevant für mich.
Danke.
 
Hi, nun was du hier brauchst ist, wie du uch in der Überschrift geschrieben hast, ein dynamisches Array.

Es gäbe zwei varianten dein Problem zu realisieren. Die eine komplexer, aber schöner, die andere, ich sage mal spartanisch, aber einfacher;)

Erst die "spartanische":)

Du brauchst ja ein Array, du darfst dem Kompiler aber keine feste Größe sagen, da du diese ja als nutzer während der Laufzeit eingeben willst.
Also musst du erst einen Zeiger auf ein Array deklarieren, damit der Kompiler schonmal weis dass du ein Array haben willst.

das siht dan etwa so aus:
C++:
int *myarray;

hier hast du dann einen Zeiger auf den Datentyp integer festgelegt (noch kein array, und auch keine Variable!!).
als nächstes brauchst du deine variable, die der user eingibt.
Mit dieser variable setz du dan dein Array, und kannst dan ganz normal darauf zugreifen.
etwa so:
C++:
int size;

	cin>>size;

	myarray = new int[size];
in der dritten wenn der nutzer jetz 10 eingibt, wir d erst in der dritten Zeile (während der Laufzeit) ein Array mit 10 Elementen angelegt.

Richtig dynamisch ist dieses jedoch nicht (deswegen meinte ich oben auch spartanisch).

Um ein voll dynamisches array hinzubekommen, müsstes du das Programm quasi selbst bestimmen lassen, zum Beispiel anhand der Anzahl der Werte, die man eingibt, dass dieses selbst die Array größe festlegt.

Oder du nutzt eine Liste, dort kannst du so viele Elemente hinzufügen und löschen wie du willst, doch das ist ein anderes Thema;)

Ich hoffe ich konnte helfen;)

EDIT:
Oh, tut mir leid, ich bin garnicht auf das beschreiben und ausgeben des Array eingegangen;)
beschreiben:
C++:
for(int i=0; i<size;i++)
	{
		myarray[i]=i*2;
	}

ausgeben:
C++:
for(int i=0; i<size;i++)
	{
		cout<<"\t"<<myarray[i]<<endl;
	}

Ps.: Das funktioniert auch mit mehr dimensionalen Arrays, falls du damit auch arbeiten musst, dann kann ich dazu auch hilfe leisten;)
 
Zuletzt bearbeitet von einem Moderator:
Ich danke dir für deine schnelle Antwort.
Aber leider verstehe ich immer noch Bahnhof.

Könntest du das vielleicht konkreter auf meine Aufgabenstellung beziehen? So ist mir deine Erklärung zu abstrakt. Sorry ;)
 
Hier, bitte;)

Habe den Quelltext auf dein Problem zugeschnitten und kommentiert, frag ruhig, wenn du noch was wissen willst;)

C++:
#include <stdafx.h>
#include <iostream>
#include <windows.h>

using namespace std;

/*Daten von erbrachten sportlichen Leistungen*/
typedef struct {
double laufen_100m; /*in Sekunden*/
double weitsprung; /*in Metern*/
} Leistungen;

/*Daten eines Schuelers*/
typedef enum {M,F} Geschlecht;

typedef struct {
string name;
string gruppe;
Geschlecht g;
Leistungen l;
} Schueler;


int main()
{
	WinMain(NULL,NULL,NULL,SW_SHOW);
}

int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
{
	int num;//variable num, für die Nutzereingabe

	Schueler *s;//zeiger auf schüler, um auch dynamisch schüler anzulegen

	cin>>num;//Die Anzahl der Schüler soll von der Standardeingabe eingelesen und in der Variablen num gespeichert werden

	s = new Schueler[num];//ein "dynamisch" angelegtes Array für unsere schueler

	//schüler Lukas an letzter stelle
	s[1].name="Lukas";
	//s[1].g=M;
	s[1].l.weitsprung=1.45;
	s[1].l.laufen_100m=20.21;
	s[1].gruppe="H";

	//schüler Margarete an erster stelle
	s[0].name="Margarete ";
	//s[0].g=W;
	s[0].l.weitsprung=7.55;
	s[0].l.laufen_100m=9.5;
	s[0].gruppe="A";

	for(int i=0; i < num ; i++ )//schleife zur Ausgabe
	{
		cout<<s[i].name.c_str()<<endl;
		cout<<s[i].g<<endl;
		cout<<s[i].l.laufen_100m<<endl;
		cout<<s[i].l.weitsprung<<endl;
		cout<<s[i].gruppe.c_str()<<endl;
		cout<<"\n"<<endl;
	}

	system("PAUSE");

	return 0;
}

EDIT: übrigends habe ich char zu string geändert, ist komfortabler, und deine Struktur "Geschlecht", wie genau soll diese benuzt werden?
 
Zuletzt bearbeitet von einem Moderator:
Das hilft mir schon sehr weiter. Danke.

Wie ich sehe programmierst du mit C++? Wir benutzen an der Uni in dem Informatikkurs lediglich C.
In der Klausur haben wir keinen Computer und müssen die Anweisungen einfach nur zu Papier bringen. So ist beispielsweise die Ausgabe der Daten überhaupt nicht relevant.

Wie genau die Geschlecht Struktur verwendent wird kann ich dir auch nicht genau sagen. Ich habe nicht mehr Informationen dazu, als das was ich schon gepostet habe.

Noch eine weitere Frage zu deinem Quelltext.
Du hast die Daten von Lukas auf s[1] gepackt und die Daten von Margerete auf s[0]. Damit gehst du doch davon aus, dass wir nur zwei Schüler haben. Wie sieht es denn jetzt aus, wenn ich zB. 25 Schüler in einer Klasse habe und Felder für die Daten aller Schüler brauche und ich erstmal nur zwei Datensätze habe. Hier im Beispiel die von Lukas und Margarete. Kann ich dann sagen s[0] für Margarete und s[num-1] für den letzten Platz, wobei num die Anzahl aller Schüler ist?
 
wenn es so steht in der Aufgabe, dass Lukas letzter sein soll, bei egal wie vielen Schueler, dan kannst du das so machen jop
C++:
s[num-1] //ist das letzte element des Arrays

alle anderen elemente sind dan halt unbelegt.
 
Zuletzt bearbeitet von einem Moderator:
Hier: // ist nicht getestet // müsste C Standart sein
C++:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/*Daten von erbrachten sportlichen Leistungen*/
typedef struct 
{
	double laufen_100m; /*in Sekunden*/
	double weitsprung; /*in Metern*/
} Leistungen;

/*Daten eines Schuelers*/
typedef enum {M,F} Geschlecht;

typedef struct 
{
	char name[50];
	char gruppe;
	Geschlecht g;
	Leistungen l;
} Schueler;

int main (void)
{
	int num;
	Schueler* f;

	printf("Bitte geben Sie die Anzahl der Schueler ein!\n"); /*1. Anweisung (siehe unten)*/
	scanf("%d", &num);

	f = (Schueler *)malloc(num*sizeof(Schueler));
	if(f == NULL) 
	{
		printf("Fehler beim allozieren des Speichers\n");
		return EXIT_FAILURE;
	}

	int i = 0;
	while( i < num ) 
	{
		printf("Wert für Schüler[%d] eingeben : \n
				Name: ", i);
		scanf("%s", &f[i]name);
		printf("Gruppe: ");
		scanf("%s", &f[i]gruppe);
		printf("Geschlecht [M/F]: ");
		scanf("%c", &f[i]g);
		printf("100m laufen: ");
		scanf("%lf", &f[i].laufen_100m);
		printf("Weitsprung: ");
		scanf("%lf", &f[i].weitsprung);
		i++;
   }
	
	// Daten ausgeben bli bla blub ... SINEP

	free(f);

	return 0;
}

Das ist keine Struktur Geschlecht das ist eine Enumeration ( Aufzählung)
ohne Zuweisung wird bei 0 angefangen zu zählen, also:
M = 0 und dann F = 1

Due könntest z.B. auch schreiben
C++:
typedef enum {M=3,F} Geschlecht;
dann wär F = 4
Man kann das ganze mit nem "string" dann ansprechen. Im Prinzip wie eine #define Anweisung, nur das automatisch hochgezählt wird.
Ist oft ganz praktisch z.B. wenn man sich Tastten definiert ASCII-Code...

EDIT:
statt malloc kannst du dir ja auch mal realloc und calloc ansehen.

MFG
 
Zuletzt bearbeitet:
Bitte bitte;) Die, die dir helfen konnten, werden sich über einen gedankten Beitrag freuen;) (Danke-Button)

MfG
 
Zurück