struct in eine Funktion übergeben

parotech

Grünschnabel
Hallo zusammen,

ich möchte einzelne Elemente der struct "z" in der Funktion "durchschnittslohn" berechnen und anschließend ausgeben.
Leider kann ich bei der Ausgabe nur ein Element ansprechen. Wie schleife ich die Elemente in der Funktion und gebe dies zurück?

Code:
#include <stdio.h>
#include <stdlib.h>

typedef struct x
{
	int nummer;
	char nachname[20];
	char vorname[20];
	char bank[20];
	char blz[9];
	char konto[8];
	float stundenlohn;
	int anzahlStunden;
} MA;

float durchschnittslohn(int counter, struct x);

int main(void)
{
	MA z[100];
	char mitarbeiterDatei[]="mitarbeiter.txt";
	char stundenDatei[]="stunden.txt";
	FILE *ma_fp, *std_fp;
	int counter, i, ma_nummer, stunden, gefunden;

	if ((ma_fp=fopen(mitarbeiterDatei,"r"))==NULL)
	{
		printf("Mitarbeiter-Datei konnte nicht geoeffnet werden.\n");
		exit(1);
	}
	else
		printf("Mitarbeiter-Datei erfolgreich geoeffnet.\n");

	if ((std_fp=fopen(stundenDatei,"r"))==NULL)
	{
		printf("Stunden-Datei konnte nicht geoeffnet werden.\n");
		exit(1);
	}
	else
		printf("Stunden-Datei erfolgreich geoeffnet.\n");

	printf("\n");

	counter=0;
	while (!feof(ma_fp))
	{
		fscanf(ma_fp,"%d %s %s %s %s %s %f",
				&z[counter].nummer,
				z[counter].nachname,
				z[counter].vorname,
				z[counter].bank,
				z[counter].blz,
				z[counter].konto,
				&z[counter].stundenlohn);
		z[counter].anzahlStunden=0;
		counter++;
	}
	counter--; // wieso

	while (!feof(std_fp))
	{
		gefunden=0;
		ma_nummer=0;
		stunden=0;
		fscanf(std_fp,"%d %d",&ma_nummer,&stunden);
		for (i=0;i<counter;i++)
		{
			if (ma_nummer==z[i].nummer)
			{
				z[i].anzahlStunden+=stunden;
				gefunden=1;
				break;
			}
		}
		if (!gefunden)
			printf("Falsche Mitarbeiternummer: %d\n",ma_nummer);
	}

	printf("\n");

	for (i=0;i<counter;i++)
	{
		printf("Gehaltsauszug\n");
		printf("Name: %s, %s\n",
					z[i].nachname,
					z[i].vorname);
		printf("Konto: %s, BLZ: %s\n",
					z[i].konto,
					z[i].blz);
		printf("Bank: %s, Betrag: %.2f Euro\n\n",
					z[i].bank,
					z[i].stundenlohn*
					(float)z[i].anzahlStunden);
	}
         printf("Counter %d\n",counter);
          
                               //Mein Funktionsaufruf (im printf)
    printf("Durchschnittslohn %f\n",durchschnittslohn(counter, z[1]));
    
	fclose(ma_fp);
	fclose(std_fp);

    system("PAUSE");	
	return 0;
}


//Meine Funktion
float durchschnittslohn(int counter, struct x z2)
{
 float gesamtlohn = 0;
 int i;    
     
 for (i=0;i<counter;i++)
 {
    gesamtlohn = gesamtlohn + z2.stundenlohn * z2.anzahlStunden;
 }

return gesamtlohn/counter;
}
 

Anhänge

Willkommen bei tutorials.de :)

Statt
struct x z2
übergibst du der Funktion
struct x *z2

Im Main rufst du eben entsprechend ohne dem [1] auf.
(Übrigens, nur falls du es nicht weißt: Beim Zählen in den [ ] beginnt man bei 0)

In der Funktion in der Schleife greifst du dann mit z2[ i ] auf das jeweilige Element zu.

Gruß
 
Hallo sheel,

vielen Dank für die schnelle Antwort.

Ich habe den Code jetzt folgendermaßen angepasst.
Leider klappt es noch nicht ich bekomme die Meldung "incompatible type for argument 2 of 'durchschnittslohn' "

Weisst Du woran das liegen könnte? Ist du Funktionsdefinition von durchschnittslohn richtig?

Code:
#include <stdio.h>
#include <stdlib.h>

typedef struct x
{
            int nummer;
            char nachname[20];
            char vorname[20];
            char bank[20];
            char blz[9];
            char konto[8];
            float stundenlohn;
            int anzahlStunden;
} MA;

float durchschnittslohn(int counter, struct x);

int main(void)
{
            MA z[100];
            char mitarbeiterDatei[]="mitarbeiter.txt";
            char stundenDatei[]="stunden.txt";
            FILE *ma_fp, *std_fp;
            int counter, i, ma_nummer, stunden, gefunden;

            if ((ma_fp=fopen(mitarbeiterDatei,"r"))==NULL)
            {
                        printf("Mitarbeiter-Datei konnte nicht geoeffnet werden.\n");
                        exit(1);
            }
            else
                        printf("Mitarbeiter-Datei erfolgreich geoeffnet.\n");

            if ((std_fp=fopen(stundenDatei,"r"))==NULL)
            {
                        printf("Stunden-Datei konnte nicht geoeffnet werden.\n");
                        exit(1);
            }
            else
                        printf("Stunden-Datei erfolgreich geoeffnet.\n");

            printf("\n");

            counter=0;
            while (!feof(ma_fp))
            {
                        fscanf(ma_fp,"%d %s %s %s %s %s %f",
                                               &z[counter].nummer,
                                               z[counter].nachname,
                                               z[counter].vorname,
                                               z[counter].bank,
                                               z[counter].blz,
                                               z[counter].konto,
                                               &z[counter].stundenlohn);
                        z[counter].anzahlStunden=0;
                        counter++;
            }
            counter--; // wieso

            while (!feof(std_fp))
            {
                        gefunden=0;
                        ma_nummer=0;
                        stunden=0;
                        fscanf(std_fp,"%d %d",&ma_nummer,&stunden);
                        for (i=0;i<counter;i++)
                        {
                                   if (ma_nummer==z[i].nummer)
                                   {
                                               z[i].anzahlStunden+=stunden;
                                               gefunden=1;
                                               break;
                                   }
                        }
                        if (!gefunden)
                                   printf("Falsche Mitarbeiternummer: %d\n",ma_nummer);
            }

            printf("\n");

            for (i=0;i<counter;i++)
            {
                        printf("Gehaltsauszug\n");
                        printf("Name: %s, %s\n",
                                                           z[i].nachname,
                                                           z[i].vorname);
                        printf("Konto: %s, BLZ: %s\n",
                                                           z[i].konto,
                                                           z[i].blz);
                        printf("Bank: %s, Betrag: %.2f Euro\n\n",
                                                           z[i].bank,
                                                           z[i].stundenlohn*
                                                           (float)z[i].anzahlStunden);
            }
         printf("Counter %d\n",counter);
          
                               //Mein Funktionsaufruf (im printf)
    printf("Durchschnittslohn %f\n",durchschnittslohn(counter, z));
    
            fclose(ma_fp);
            fclose(std_fp);

    system("PAUSE");    
            return 0;
}


//Meine Funktion
float durchschnittslohn(int counter, struct x *z2)
{
 float gesamtlohn = 0;
 int i;    
     
 for (i=0;i<counter;i++)
 {
    gesamtlohn = gesamtlohn + z2[i].stundenlohn * z2[i].anzahlStunden;
 }

return gesamtlohn/counter;
}
 
Moin,

C++:
float durchschnittslohn(int counter, struct x *z2)

Mal davon abgesehen, dass hier ein Pointer erwartet wird .... was macht denn das 'x' :confused:

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
Hat jetzt funktioniert. Die Funktionsdefinition war nicht korrekt und musste
Code:
float durchschnittslohn(int counter, struct x[]);
lauten.

Vielen Dank nochmal :)
 
Zurück