Entry 3070

Klausurtest

   

Submitted by Matthias Esken on Jan. 22, 2010 at 10:26 a.m.
Language: C. Code size: 4.1 KB.

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

/*
Laut Aufgabenstellung gibt es maximal 100 Mitarbeiter
*/
#define MAX_MITARBEITER 100

/*
  Definition der Struktur der Mitarbeiterdaten
  - nummer: 
      Die Mitarbeiternummer muss nicht unbedingt im Bereich von 1-100 liegen, 
      aber eine Zahl der Größe bis zu 2^32-1 sollte ausreichen.
  - nachname: 
      Ein char-Array das ausreichend dimensioniert ist.
  - vorname: 
      Ein char-Array das ausreichend dimensioniert ist
  - bank: 
      Ein char-Array das ausreichend dimensioniert ist
  - blz: 
      Die Bankleitzahl enthält zwar nur Ziffern, wird aber nicht für Rechen-
      operationen benötigt. Die Definition erfolgt daher als char-Array mit
      einer Größe von 8 Zeichen.
  - kontonummer:
      Die Kontonummer enthält nur Ziffern, wird aber nicht für Rechenoperationen
      benötigt. Die Definition erfolgt daher als char-Array mit einer Größe von 
      10 Zeichen.
  - stundenlohn:
      Der Stundenlohn ist eine Zahl mit Nachkommastellen.
*/
typedef struct {
    unsigned long nummer;
    char nachname[50];
    char vorname[50];
    char bank[50];
    char blz[8];
    char kontonummer[10];
    float stundenlohn;
} MITARBEITER;



int lese_stunden(unsigned long mitarbeiternummer) {
    /*
    Stunden für den Mitarbeiter ermitteln.
    
    Alle Stunden für die übergebene Mitarbeiternummer aus der Datei lesen,
    addieren und die Summe zurückgeben.
    */
    FILE* fp;
    unsigned long nummer;
    unsigned long stunden;
    unsigned long stunden_gesamt = 0;
    int result;

	if ((fp = fopen("stunden.txt","rt")) == NULL) {
		printf("Fehler beim Oeffnen der Stundendaten\n");
		exit(EXIT_FAILURE);
	    }
    stunden_gesamt = 0;
    while (fscanf(fp, "%lu %lu", &nummer, &stunden) != EOF) {
        if (mitarbeiternummer == nummer) {
            stunden_gesamt += stunden;
        }
    }
    fclose(fp);

	return stunden_gesamt;
}


void drucke_gehaltsauszug(MITARBEITER* m, int stunden) {
     /*
     Gehaltsauszug auf der Konsole ausgeben.

     Eine Übergabe der Mitrabeiterdaten als Referenz wäre nicht erforderlich
     gewesen, da in dieser Routine keine Daten der Struktur verändert werden
     sollen. Die Übergabe als Referenz statt "by Value" wurde aus
     Performancegründen gewählt.
     */
     printf("GEHALTSAUSZUG\nName: %s, %s\nKonto: %s, BLZ: %s\nBank: %s, Betrag: %.2f\n\n\n",
         m->nachname,
         m->vorname,
         m->kontonummer,
         m->blz,
         m->bank,
         m->stundenlohn * stunden
         );
     }
     


int main(void) {
    FILE* fp;
    MITARBEITER m[100];
    long count = 0;
    int result;
    float stunden_gesamt;


	/*
	Mitarbeiterdaten ermitteln und in einem Array ablegen.
	
	Prinzipiell könnte man auch auf das Array komplett verzichten und die
	Stundenermittlung direkt in die Schleife zum Auslesen der Mitarbeiter
	einbauen.
	*/
    if ((fp = fopen("mitarbeiter.txt","rt")) == NULL) {
		printf("Fehler beim Oeffnen der Mitarbeiterdatei\n");
		exit(EXIT_FAILURE);
	    }
    while (fscanf(fp, "%lu %s %s %s %s %s %f", 
            &m[count].nummer,
            m[count].nachname,
            m[count].vorname,
            m[count].bank,
            m[count].blz,
            m[count].kontonummer,
            &m[count].stundenlohn
            ) != EOF) {
          
        // printf("%d, %s", m[count].nummer, m[count].nachname);
        // system("PAUSE");	
        count++;
        }
    fclose(fp);

    /*
    Stunden für Mitarbeiter ermitteln und Gehaltsauszug drucken.
    
    Die Datei mit den Stundendaten wird für jeden Mitarbeiter einmal komplett
    abgearbeitet. Das ist von der Systembelastung her alles andere als optimal.
    Eine alternative Implementierung würde diese Datei nur einmal in ein
    Array einlesen und dann nur noch das Array durchsuchen.
    */
    int i;
    for (i = 0; i < count; i++) {
        stunden_gesamt = lese_stunden(m[i].nummer);
        drucke_gehaltsauszug(&m[i], stunden_gesamt);
    }

    system("PAUSE");	
	return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).