Verarbeiten einer Personen-Datei

amine89

Mitglied
Entwickeln Sie ein Programm, das die in der Datei gespeicherten Daten zeilenweise
einliest und in einem Array mit der definierten Struktur speichert. Verwenden Sie für
jeden Datensatz die von ihnen als Übung entwickelte Funktion „line2struct“. Diese
Funktion soll jeweils für einen einzelnen eingelesenen Datensatz die Prüfsumme der
Matrikel-Nummer ermitteln und mit der des eingelesenen Datensatzes vergleichen. Im
Erfolgsfall ist der Datensatz zu speichern und als Rückgabewert Null zurückzugeben
anderenfalls die aus der Matrikel-Nummer falsch erkannten Prüfziffern. Ein Datensatz
mit falscher Matrikel-Nummer soll nicht gespeichert werden.

Nach kompletter Bearbeitung der Inhalte der Datei sind diese in einem weiteren
Unterprogramm in tabellarischer Form auf dem Bildschirm auszugeben.
Ermitteln sie für jeden eingelesenen Datensatz die Gültigkeit der eingelesenen Matrikel-
Nummer durch das im Weiteren beschriebenen Verfahren der Prüfziffernberechnung.
Prüfziffernermittlung:

Die Matrikel-Nummer besteht aus 8 signifikanten Ziffern und zwei weiteren Ziffern als
Prüfziffern zur Verifikation der Matrikel-Nummer.
Die Prüfziffern werden aus den 8 signifikanten Stellen der Matrikel-Nummer als
Quersumme ermittelt. Bei einer einstelligen Prüfsumme wird eine Null vorangestellt.
Das Ergebnis wird dann an die Matrikel-Nummer angehängt.

Beispiel:

Quersumme 11129447 = 29
Ergebnis: 10-stellige Mat.-Nr. 1112944729

Beispiel-Auszug aus der Daten-Datei:

1;StudentName1;Michael; 1112944729
2;StudentName2;Alexander;1112335117
3;StudentName3;Susanne;11........
4;StudentName4;Frank;11.........
5;StudentName5;Christine;11........
Definition der Struktur und des Funktionsprototypen:
typedef unsigned char BYTE;
typedef struct{
unsigned int Nr;
char Nachname[20];
char Vorname[20|;
unsigned int MatNr;
} tDatenStudent;

BYTE line2struct(char* , tDatensatz*);

Der Anfang des Programms sieht folgendes aus :

C++:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
typedef struct
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
}tDatenStudent;
 
 
int main (void)
{
	
  FILE *datei;
  
  tDatenStudent tds;   
 
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  while(fscanf(datei,"%d;%s;%s;%d",&tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr) != EOF)
{
   
}
   }
   else {
      printf("Konnte Datei nicht finden bzw. öffnen!\n");
   }
   
   fclose (datei);

  return 0;
}

weiter komme ih leider nicht klar , vlt kann mir jemand erklären was es verlangen ist mit Funktion oder wie es weiter aussieht ?

Danke
Grüße
Amine
 
Was hast du probiert und was ist unklar?
Du brauchst einen Array des Structs.
Du brauchst eine Funktion, die eine Quersumme berechnet.
Du musst die Daten als Tabelle ausgeben.

Gehe am besten in dieser Reihenfolge vor. Wenn etwas konkretes unklar ist, kannst du selbstverständlich wieder fragen.

Gruss
cwriter
 
Was hast du probiert und was ist unklar?
Du brauchst einen Array des Structs.
Du brauchst eine Funktion, die eine Quersumme berechnet.
Du musst die Daten als Tabelle ausgeben.

Gehe am besten in dieser Reihenfolge vor. Wenn etwas konkretes unklar ist, kannst du selbstverständlich wieder fragen.

Gruss
cwriter

Hallo!

Ich habe jetzt die Funktion so geschrieben :
C++:
BYTE line2struct(char* neu , tDatenStudent*tds ){
		
	neu=&tds->MatNr;
	
	for(int i=0;i<=8;i++ ){
		
	char summe=neu[i]+neu[i+1];
	neu[i]=neu[i+1];
	neu[i+1]=summe;   
	
    for(int j=8;j<=9;j++){
    char psumme[2]={neu[j],neu[j+1]};

    if (summe == psumme){ printf("%d;%s;%s;%d",&tds->Nr,&tds->Nachname,&tds->Vorname,&tds->MatNr);}
                         }    };
  return 0;

Das ganze Programm sieht jetzt so aus :
C++:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
typedef struct
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
}tDatenStudent;
 
 
int main (void)
{
	
  FILE *datei;
  
  tDatenStudent tds;   
 
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  while(fscanf(datei,"%d;%s;%s;%d",&tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr) != EOF)
{
	
	BYTE line2struct(char* neu , tDatenStudent*tds ){
		
	neu=&tds->MatNr;
	
	for(int i=0;i<=8;i++ ){
		
	char summe=neu[i]+neu[i+1];
	neu[i]=neu[i+1];
	neu[i+1]=summe;   
	
    for(int j=8;j<=9;j++){
    char psumme[2]={neu[j],neu[j+1]};

    if (summe == psumme){ printf("%d;%s;%s;%d",&tds->Nr,&tds->Nachname,&tds->Vorname,&tds->MatNr);}
                         }    };
  return 0; 
  	                                   }
}
   }
   else {
      printf("Konnte Datei nicht finden bzw. öffnen!\n");
   }
   
   fclose (datei);

  return 0;
}

Der Compiler zeigt mir solche Fehler :
[Error] 'for' loop initial declarations are only allowed in C99 mode.

sowas habe ich leider noch nie bekommen!

Kann mir vlt jmd helfen oder zeigen was ich falsch gemacht habe ?
Das wäre sehr nett.



Einen schönen Samstag !
 
Stimmt ! Danke :)7

Nun wird das Programm kompiliert aber zeigt keine Ausgabe !

Und der Compiler sagt mir :
[Warning] assignment from incompatible pointer type [enabled by default]
[Warning] comparison between pointer and integer [enabled by default]

Gruss
Amine
 
Nun, dein
C:
if (summe == psumme)
Kann nicht funktionieren. Du vergleichst einen Pointer mit einem char. Wenn schon, dann
C:
if (*summe == psumme)

Aber auch das ist komisch. Warum nicht mit atoi()?

Gewöhne dir bitte einen anderen Stil an. Es ist schwer, bei dem Code den Überblick zu behalten.

Gruss
cwriter
 
Nun, dein
C:
if (summe == psumme)
Kann nicht funktionieren. Du vergleichst einen Pointer mit einem char. Wenn schon, dann
C:
if (*summe == psumme)

Aber auch das ist komisch. Warum nicht mit atoi()?

Gewöhne dir bitte einen anderen Stil an. Es ist schwer, bei dem Code den Überblick zu behalten.

Gruss
cwriter

ich kenne diese atoi() nicht deswegen! (ich bin noch ein Anfänger )

so bekomme ich keine Meldung aber auch keine Ausgabe !!
gruss
amine
 
C:
char psumme[2]={neu[j],neu[j+1]};
Sollte
C:
char psumme =neu[j]*10+neu[j+1];
sein.
Dann einfach summe mit psumme vergleichen.

Und schreibe die Funktionen der Übersicht zuliebe nicht gekapselt.

Gruss
cwriter
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück