Ich habe folgende Aufgabe und leider auch gerade ein paar Probleme dabei, ich hoffe mir kann hier einer möglichst schnell weiter helfen, also :
"In einer Datei stehen sequentiell Datensätze folgender Struktur :
Bezeichnung, Teilenummer, Seriennummer, Lagerbestand in Stück ;
Die einzelnen Einträge in der Datei sind unsortiert.
Schreiben Sie ein Programm, welches die Datei alternativ nach den Verfahren "Quicksort" und "Bubblesort" nach Seriennummern, Bezeichnung, und Teilenummern sortiert. Einträge mit gleicher Teilenummer und Bezeichnung sollen zu einem Eintrag aufaddiert werden.
Einträge mit gleicher Seriennummer sollen in einer Fehlerdatei ausgegeben werden. Teile mit unterschiedlicher Teilenummer aber gleicher Bezeichnung sind zulässig. Die Sortierung nach Bezeichnung soll dabei zusätzlich aufsteigende Teilenummern berücksichtigen. Achten Sie auf die Fehlerbehandlung der Dateianschlüsse, vergleichen Sie die Sortierzeiten..."
... soweit so gut, ich hab mal angefangen das Programm zu schreiben, welches aber nur Bezeichnung und Teilenummer enthält und auch nur nach Bubblesort sortiert.
Funktionierender Quellcode ohne Seriennummer :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __LAGER_H__
#define __LAGER_H__
struct Ddata
{
char *bezeichner;
int iteilenummer;
};
struct lager
{
int anz;
struct Ddata **p;
};
struct lager *create_lager(int num);
void destroy_lager(struct lager *d, int num);
struct lager *get_lager_from_file();
void enter_lager(struct lager *d, int index, char *bezeichner, int size);
int nvergleich(struct Ddata *d1, struct Ddata *d2);
int gvergleich(struct Ddata *d1, struct Ddata *d2);
void sort_lager(int n, struct lager *d, int (*nvergleich) (struct Ddata*, struct Ddata*));
#endif
struct lager *create_lager(int num)
{
struct lager *d;
int i;
d = (struct lager*) malloc(sizeof(struct lager));
d->p = (struct Ddata**) calloc(num, sizeof(struct Ddata*));
for(i = 0; i < num; i++)
d->p = (struct Ddata*) malloc(sizeof(struct Ddata));
d->anz = num;
return d;
}
void destroy_lager(struct lager *d, int num)
{
int i;
for(i = 0; i < num; i++)
{
free(d->p->bezeichner);
free(d->p);
}
free(d->p);
free(d);
}
struct lager* get_lager_from_file()
{
FILE* fp;
struct lager* d;
int i;
char name_temp[256];
int isize_temp;
fp = fopen("daten.txt", "r");
fscanf(fp, "%d", &i);
if(i <= 0)
return 0;
d = create_lager(i);
for(i = 0; i < d->anz; i++)
{
fscanf(fp, "%s %d",name_temp, &isize_temp);
name_temp[strlen(name_temp)-1] = 0;
enter_lager(d, i, name_temp, isize_temp);
}
fclose(fp);
return d;
}
void enter_lager(struct lager *d, int index, char *bezeichner, int size)
{
d->p[index]->bezeichner = (char*) malloc(strlen(bezeichner)+1);
strcpy(d->p[index]->bezeichner, bezeichner);
d->p[index]->iteilenummer = size;
}
int nvergleich(struct Ddata *d1, struct Ddata *d2)
{
return strcmp(d1->bezeichner, d2->bezeichner);
}
int gvergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iteilenummer - d2->iteilenummer);
}
void sort_lager(int n, struct lager *d, int (*vergleich)(struct Ddata *d1, struct Ddata *d2))
{
int i, k;
struct Ddata *temp;
for(i = n-1; i > 0; i--)
{
for( k = 0; k < i; k++ )
{
if(vergleich(d->p[k], d->p[k+1]) > 0)
{
temp = d->p[k];
d->p[k] = d->p[k+1];
d->p[k+1] = temp;
}
}
}
}
void main()
{
struct lager *d;
int index = 0;
int iauswahl;
if(!(d = get_lager_from_file()))
{
printf("Fehler beim Einlesen!\n");
exit(1);
}
printf("Folgende Daten wurden eingelesen: \n\n");
while(index < d->anz)
{
printf(" %s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
}
printf("\nBitte geben Sie an wonach sie sortieren wollen : \n\n") ;
printf("1 - Bezeichung \n") ;
printf("2 - Teilenummer \n\n") ;
printf("Auswahl : ") ;
scanf("%d",&iauswahl);
/*Sortieren nach Bezeichnung*/
if(iauswahl==1)
{sort_lager(d->anz, d, nvergleich);
index = 0;
printf("\nSortiert nach Bezeichnung: \n\n");
while(index < d->anz)
{
printf("%s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
} }
/*Sortieren nach Teilenummer*/
if(iauswahl==2)
{
sort_lager(d->anz, d, gvergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
}
}
destroy_lager(d, d->anz);
}
Nun habe ich das Problem, dass ich das Programm einfach nicht zum laufen bekomme wenn ich die Seriennummer hinzufüge. Kann mir jemand vllt sagen wo mein Fehler liegt ?
Quellcode mit Seriennummer :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __LAGER_H__
#define __LAGER_H__
struct Ddata
{
char *bezeichner;
int iteilenummer;
int iseriennummer;
};
struct lager
{
int anz;
struct Ddata **p;
};
struct lager *create_lager(int num);
void destroy_lager(struct lager *d, int num);
struct lager *get_lager_from_file();
void enter_lager(struct lager *d, int index, char *bezeichner, int size, int serie);
int nvergleich(struct Ddata *d1, struct Ddata *d2);
int gvergleich(struct Ddata *d1, struct Ddata *d2);
int svergleich(struct Ddata *d1, struct Ddata *d2);
void sort_lager(int n, struct lager *d, int (*nvergleich) (struct Ddata*, struct Ddata*));
#endif
struct lager *create_lager(int num)
{
struct lager *d;
int i;
d = (struct lager*) malloc(sizeof(struct lager));
d->p = (struct Ddata**) calloc(num, sizeof(struct Ddata*));
for(i = 0; i < num; i++)
d->p = (struct Ddata*) malloc(sizeof(struct Ddata));
d->anz = num;
return d;
}
void destroy_lager(struct lager *d, int num)
{
int i;
for(i = 0; i < num; i++)
{
free(d->p->bezeichner);
free(d->p);
}
free(d->p);
free(d);
free(d->p);
free(d);
}
struct lager* get_lager_from_file()
{
FILE* fp;
struct lager* d;
int i;
char name_temp[256];
int isize_temp;
int iserien;
fp = fopen("daten.txt", "r");
fscanf(fp, "%d", &i);
if(i <= 0)
return 0;
d = create_lager(i);
for(i = 0; i < d->anz; i++)
{
fscanf(fp, "%s %d %d",name_temp, &isize_temp, &iserien);
name_temp[strlen(name_temp)-1] = 0;
enter_lager(d, i, name_temp, isize_temp, iserien);
}
fclose(fp);
return d;
}
void enter_lager(struct lager *d, int index, char *bezeichner, int size, int serie)
{
d->p[index]->bezeichner = (char*) malloc(strlen(bezeichner)+1);
strcpy(d->p[index]->bezeichner, bezeichner);
d->p[index]->iteilenummer = size;
d->p[index]->iseriennummer = serie;
}
int nvergleich(struct Ddata *d1, struct Ddata *d2)
{
return strcmp(d1->bezeichner, d2->bezeichner);
}
int gvergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iteilenummer - d2->iteilenummer);
}
int svergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iseriennummer - d2->iseriennummer);
}
void sort_lager(int n, struct lager *d, int (*vergleich)(struct Ddata *d1, struct Ddata *d2))
{
int i, k;
struct Ddata *temp;
for(i = n-1; i > 0; i--)
{
for( k = 0; k < i; k++ )
{
if(vergleich(d->p[k], d->p[k+1]) > 0)
{
temp = d->p[k];
d->p[k] = d->p[k+1];
d->p[k+1] = temp;
}
}
}
}
void main()
{
struct lager *d;
int index = 0;
int iauswahl;
if(!(d = get_lager_from_file()))
{
printf("Fehler beim Einlesen!\n");
exit(1);
}
printf("Folgende Daten wurden eingelesen: \n\n");
while(index < d->anz)
{
printf(" %s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
printf("\nBitte geben Sie an wonach sie sortieren wollen : \n\n") ;
printf("1 - Bezeichung \n") ;
printf("2 - Teilenummer \n\n") ;
printf("Auswahl : ") ;
scanf("%d",&iauswahl);
/*Sortieren nach Bezeichnung*/
if(iauswahl==1)
{sort_lager(d->anz, d, nvergleich);
index = 0;
printf("\nSortiert nach Bezeichnung: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
/*Sortieren nach Teilenummer*/
if(iauswahl==2)
{
sort_lager(d->anz, d, gvergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
/*Sortieren nach Seriennummer*/
if(iauswahl==3)
{
sort_lager(d->anz, d, svergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
destroy_lager(d, d->anz);
}
Ich hoffe mir kann irgendjemand helfen.
mfg Xpaddy = )
"In einer Datei stehen sequentiell Datensätze folgender Struktur :
Bezeichnung, Teilenummer, Seriennummer, Lagerbestand in Stück ;
Die einzelnen Einträge in der Datei sind unsortiert.
Schreiben Sie ein Programm, welches die Datei alternativ nach den Verfahren "Quicksort" und "Bubblesort" nach Seriennummern, Bezeichnung, und Teilenummern sortiert. Einträge mit gleicher Teilenummer und Bezeichnung sollen zu einem Eintrag aufaddiert werden.
Einträge mit gleicher Seriennummer sollen in einer Fehlerdatei ausgegeben werden. Teile mit unterschiedlicher Teilenummer aber gleicher Bezeichnung sind zulässig. Die Sortierung nach Bezeichnung soll dabei zusätzlich aufsteigende Teilenummern berücksichtigen. Achten Sie auf die Fehlerbehandlung der Dateianschlüsse, vergleichen Sie die Sortierzeiten..."
... soweit so gut, ich hab mal angefangen das Programm zu schreiben, welches aber nur Bezeichnung und Teilenummer enthält und auch nur nach Bubblesort sortiert.
Funktionierender Quellcode ohne Seriennummer :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __LAGER_H__
#define __LAGER_H__
struct Ddata
{
char *bezeichner;
int iteilenummer;
};
struct lager
{
int anz;
struct Ddata **p;
};
struct lager *create_lager(int num);
void destroy_lager(struct lager *d, int num);
struct lager *get_lager_from_file();
void enter_lager(struct lager *d, int index, char *bezeichner, int size);
int nvergleich(struct Ddata *d1, struct Ddata *d2);
int gvergleich(struct Ddata *d1, struct Ddata *d2);
void sort_lager(int n, struct lager *d, int (*nvergleich) (struct Ddata*, struct Ddata*));
#endif
struct lager *create_lager(int num)
{
struct lager *d;
int i;
d = (struct lager*) malloc(sizeof(struct lager));
d->p = (struct Ddata**) calloc(num, sizeof(struct Ddata*));
for(i = 0; i < num; i++)
d->p = (struct Ddata*) malloc(sizeof(struct Ddata));
d->anz = num;
return d;
}
void destroy_lager(struct lager *d, int num)
{
int i;
for(i = 0; i < num; i++)
{
free(d->p->bezeichner);
free(d->p);
}
free(d->p);
free(d);
}
struct lager* get_lager_from_file()
{
FILE* fp;
struct lager* d;
int i;
char name_temp[256];
int isize_temp;
fp = fopen("daten.txt", "r");
fscanf(fp, "%d", &i);
if(i <= 0)
return 0;
d = create_lager(i);
for(i = 0; i < d->anz; i++)
{
fscanf(fp, "%s %d",name_temp, &isize_temp);
name_temp[strlen(name_temp)-1] = 0;
enter_lager(d, i, name_temp, isize_temp);
}
fclose(fp);
return d;
}
void enter_lager(struct lager *d, int index, char *bezeichner, int size)
{
d->p[index]->bezeichner = (char*) malloc(strlen(bezeichner)+1);
strcpy(d->p[index]->bezeichner, bezeichner);
d->p[index]->iteilenummer = size;
}
int nvergleich(struct Ddata *d1, struct Ddata *d2)
{
return strcmp(d1->bezeichner, d2->bezeichner);
}
int gvergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iteilenummer - d2->iteilenummer);
}
void sort_lager(int n, struct lager *d, int (*vergleich)(struct Ddata *d1, struct Ddata *d2))
{
int i, k;
struct Ddata *temp;
for(i = n-1; i > 0; i--)
{
for( k = 0; k < i; k++ )
{
if(vergleich(d->p[k], d->p[k+1]) > 0)
{
temp = d->p[k];
d->p[k] = d->p[k+1];
d->p[k+1] = temp;
}
}
}
}
void main()
{
struct lager *d;
int index = 0;
int iauswahl;
if(!(d = get_lager_from_file()))
{
printf("Fehler beim Einlesen!\n");
exit(1);
}
printf("Folgende Daten wurden eingelesen: \n\n");
while(index < d->anz)
{
printf(" %s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
}
printf("\nBitte geben Sie an wonach sie sortieren wollen : \n\n") ;
printf("1 - Bezeichung \n") ;
printf("2 - Teilenummer \n\n") ;
printf("Auswahl : ") ;
scanf("%d",&iauswahl);
/*Sortieren nach Bezeichnung*/
if(iauswahl==1)
{sort_lager(d->anz, d, nvergleich);
index = 0;
printf("\nSortiert nach Bezeichnung: \n\n");
while(index < d->anz)
{
printf("%s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
} }
/*Sortieren nach Teilenummer*/
if(iauswahl==2)
{
sort_lager(d->anz, d, gvergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer);
index++;
}
}
destroy_lager(d, d->anz);
}
Nun habe ich das Problem, dass ich das Programm einfach nicht zum laufen bekomme wenn ich die Seriennummer hinzufüge. Kann mir jemand vllt sagen wo mein Fehler liegt ?
Quellcode mit Seriennummer :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef __LAGER_H__
#define __LAGER_H__
struct Ddata
{
char *bezeichner;
int iteilenummer;
int iseriennummer;
};
struct lager
{
int anz;
struct Ddata **p;
};
struct lager *create_lager(int num);
void destroy_lager(struct lager *d, int num);
struct lager *get_lager_from_file();
void enter_lager(struct lager *d, int index, char *bezeichner, int size, int serie);
int nvergleich(struct Ddata *d1, struct Ddata *d2);
int gvergleich(struct Ddata *d1, struct Ddata *d2);
int svergleich(struct Ddata *d1, struct Ddata *d2);
void sort_lager(int n, struct lager *d, int (*nvergleich) (struct Ddata*, struct Ddata*));
#endif
struct lager *create_lager(int num)
{
struct lager *d;
int i;
d = (struct lager*) malloc(sizeof(struct lager));
d->p = (struct Ddata**) calloc(num, sizeof(struct Ddata*));
for(i = 0; i < num; i++)
d->p = (struct Ddata*) malloc(sizeof(struct Ddata));
d->anz = num;
return d;
}
void destroy_lager(struct lager *d, int num)
{
int i;
for(i = 0; i < num; i++)
{
free(d->p->bezeichner);
free(d->p);
}
free(d->p);
free(d);
free(d->p);
free(d);
}
struct lager* get_lager_from_file()
{
FILE* fp;
struct lager* d;
int i;
char name_temp[256];
int isize_temp;
int iserien;
fp = fopen("daten.txt", "r");
fscanf(fp, "%d", &i);
if(i <= 0)
return 0;
d = create_lager(i);
for(i = 0; i < d->anz; i++)
{
fscanf(fp, "%s %d %d",name_temp, &isize_temp, &iserien);
name_temp[strlen(name_temp)-1] = 0;
enter_lager(d, i, name_temp, isize_temp, iserien);
}
fclose(fp);
return d;
}
void enter_lager(struct lager *d, int index, char *bezeichner, int size, int serie)
{
d->p[index]->bezeichner = (char*) malloc(strlen(bezeichner)+1);
strcpy(d->p[index]->bezeichner, bezeichner);
d->p[index]->iteilenummer = size;
d->p[index]->iseriennummer = serie;
}
int nvergleich(struct Ddata *d1, struct Ddata *d2)
{
return strcmp(d1->bezeichner, d2->bezeichner);
}
int gvergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iteilenummer - d2->iteilenummer);
}
int svergleich(struct Ddata *d1, struct Ddata *d2)
{
return (d1->iseriennummer - d2->iseriennummer);
}
void sort_lager(int n, struct lager *d, int (*vergleich)(struct Ddata *d1, struct Ddata *d2))
{
int i, k;
struct Ddata *temp;
for(i = n-1; i > 0; i--)
{
for( k = 0; k < i; k++ )
{
if(vergleich(d->p[k], d->p[k+1]) > 0)
{
temp = d->p[k];
d->p[k] = d->p[k+1];
d->p[k+1] = temp;
}
}
}
}
void main()
{
struct lager *d;
int index = 0;
int iauswahl;
if(!(d = get_lager_from_file()))
{
printf("Fehler beim Einlesen!\n");
exit(1);
}
printf("Folgende Daten wurden eingelesen: \n\n");
while(index < d->anz)
{
printf(" %s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
printf("\nBitte geben Sie an wonach sie sortieren wollen : \n\n") ;
printf("1 - Bezeichung \n") ;
printf("2 - Teilenummer \n\n") ;
printf("Auswahl : ") ;
scanf("%d",&iauswahl);
/*Sortieren nach Bezeichnung*/
if(iauswahl==1)
{sort_lager(d->anz, d, nvergleich);
index = 0;
printf("\nSortiert nach Bezeichnung: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
/*Sortieren nach Teilenummer*/
if(iauswahl==2)
{
sort_lager(d->anz, d, gvergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
/*Sortieren nach Seriennummer*/
if(iauswahl==3)
{
sort_lager(d->anz, d, svergleich);
index = 0;
printf("\nSortiert nach Teilenummern: \n\n");
while(index < d->anz)
{
printf("%s, %d, %d\n",d->p[index]->bezeichner, d->p[index]->iteilenummer, d->p[index]->iseriennummer);
index++;
}
}
destroy_lager(d, d->anz);
}
Ich hoffe mir kann irgendjemand helfen.
mfg Xpaddy = )