Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
simmizi
Anmeldungsdatum: 28.06.2006 Beiträge: 3
|
Verfasst am: 28. Jun 2006 13:56 Titel: geburtsdatum mit bubblesort sortieren |
|
|
hallo!
ich bin gerade dabei ein programm zu schreiben, welches geburtstagslisten erstellen und auslesen kann in einer externen datei...
das programm funktioniert einwandfrei - jetzt jedoch möchte ich, dass bei der listenausgabe, die einträge geordnet werden, nach dem geburtstag...
um das umzusetzen wollte ich bubblesort benutzen, jedoch bin ich jetzt an eine stelle gekommen, an dem die sache ganz schön kompliziert wird und ich nicht so recht weiter weiß...
ich habe im code die stellen, die für den bubblesort prozess verändert werden müssen, als kommentare kenntlich gemacht....
wenn ihr etwas nicht nachvollziehen könnt, dann fragt einfach...ich bin für jede hilfe dankbar!
hier der code:
Code: |
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <conio.h>
void bubble(char *items, int count);
int main()
{
struct datum {int tag;int monat;int jahr;};
struct person {char name[20];char vorname[20];struct datum geburtsdatum;char telefon[20];};
char dateiname[25],pdatum[11];
char *p1,*p2,*p3;
int i,n,index,menu;
person freund[40];
FILE *datei;
for(i=1;i<=500;i++)
{
printf("Was wollen Sie tun?");
printf("\n[1] Geburtstagsliste erstellen");
printf("\n[2] Geburtstagsliste auslesen");
printf("\n[3] Beenden\n");
scanf("%d",&index);
switch(index)
{
case 1:
{
printf("Erstellung einer Geburtstagsliste\nZum Beenden bitte 'end' eingeben\n");
printf("Bitte geben Sie einen Dateinamen an: ");
scanf("%s",dateiname);
datei=fopen(dateiname,"w");
if(datei==NULL)
printf("Datei kann nicht geoeffnet werden!");
else
{
n=1;
printf("Geben Sie Ihre Daten ein!\n");
printf("Name: ");
scanf("%s",freund[n].name);
while(strcmp(freund[n].name,"end"))
{
printf("Vorname: ");
scanf("%s",freund[n].vorname);
printf("Geburtsdatum: ");
scanf("%s",pdatum);
p1=strtok(pdatum,".");
p2=strtok(NULL,".");
p3=strtok(NULL,".");
printf("%s %s %s\n",p1,p2,p3);
freund[n].geburtsdatum.tag=atoi(p1);
freund[n].geburtsdatum.monat=atoi(p2);
freund[n].geburtsdatum.jahr=atoi(p3);
printf("%i ",freund[n].geburtsdatum.tag);
printf("%i ",freund[n].geburtsdatum.monat);
printf("%i ",freund[n].geburtsdatum.jahr);
printf("Telefonnummer: ");
scanf("%s",freund[n].telefon);
fwrite(&freund[n],sizeof(freund[n]),1,datei);
n++;
printf("\nName: ");
scanf("%s",freund[n].name);
}
printf("\nDas war's!\n\n");
fclose(datei);
}
}
break;
case 2:
{
printf("Auslesen einer Geburtstagsliste\n\n");
printf("Bitte geben Sie den Dateinamen Ihrer Geburtstagsliste an: ");
scanf("%s",dateiname);
datei=fopen(dateiname,"r");
if(datei==NULL)
printf("Datei kann nicht geoeffnet werden!");
else
{
n=1;
fread(&freund[n],sizeof(freund[n]),1,datei);
while(!feof(datei))
{
printf("Name: ");puts(freund[n].name);
printf("Vorname: ");puts(freund[n].vorname);
//printf("Geburtsdatum: ");bubble(freund[n].
printf("Geburtsdatum: ");printf("%i.%i.%i\n",freund[n].geburtsdatum.tag,freund[n].geburtsdatum.monat,freund[n].geburtsdatum.jahr);
printf("Telefonnummer: ");puts(freund[n].telefon);
printf("\n");
n++;
fread(&freund[n],sizeof(freund[n]),1,datei);
}
}
fclose(datei);
printf("\nDas war's!\n\n");
}
break;
case 3:
{
goto progverlassen;
}
}
menu=getch();
if(menu==13)
system("cls");
}
progverlassen: {}
}
/*void bubble(char *items, int gesamtzahl)
{
int i, j;
char t;
for(i = 1; i < gesamtzahl; ++i)
for( j = gesamtzahl-1; j >= i; --j) {
if(items[j - 1] > items[ j ]) {
// Elemente austauschen
t = items[j - 1];
items[j - 1] = items[ j ];
items[ j ] = t;
}
}
}
*/
|
|
|
Nach oben |
|
|
|
ED209
Anmeldungsdatum: 30.05.2005 Beiträge: 122
|
Verfasst am: 28. Jun 2006 18:57 Titel: |
|
|
Wo genau liegt denn das Problem?
Am Sortieralgorithmus musst du ja nichts aendern, lediglich die Vergleichsoperation und das Austauschen muss an deine Verhaeltnisse angepasst werden.
Gruss
ED
PS: Deine Loesung mit "Goto Programmverlassen" ist recht unschoen, selbst in C. Das kommt sicher von einer Basic-Vergangenheit. _________________ +++++++++++++[>++++>+<<-]>.--.>---. |
|
Nach oben |
|
|
simmizi
Anmeldungsdatum: 28.06.2006 Beiträge: 3
|
Verfasst am: 28. Jun 2006 20:25 Titel: |
|
|
ich weiß, dass der goto befehl nicht sehr beliebt unter programmierern ist, jedoch habe ich hier keine andere lösung gefunden aus der menü-schleife (switch-anweisungs-schleife) herauszukommen....
mein problem ist, dass ich nicht weiß, wie ich die einzelnen daten (geburtstag, -monat, -jahr) an das unterprogramm übergebe und diese dort sortieren lasse....
wäre es vielleicht sinnvoll folgende deklerationen global zu deklarieren, damit ich auch im unterprogramm z.b. auf freund[n].geburtsdatum.tag zugreifen kann?
Code: | struct datum {int tag;int monat;int jahr;};
struct person {char name[20];char vorname[20];struct datum geburtsdatum;char telefon[20];}; |
|
|
Nach oben |
|
|
ED209
Anmeldungsdatum: 30.05.2005 Beiträge: 122
|
Verfasst am: 29. Jun 2006 12:50 Titel: |
|
|
Zitat: |
ich weiß, dass der goto befehl nicht sehr beliebt unter programmierern ist, jedoch habe ich hier keine andere lösung gefunden aus der menü-schleife (switch-anweisungs-schleife) herauszukommen.
|
Ich wuerde aus der For-Schleife eine Do-While-Schleife machen und als Abbruchbedingung ((i <= 500) || (index==3)) (wieso zaehlst du ueberhaupt bis 500?)
Zitat: |
wäre es vielleicht sinnvoll folgende deklerationen global zu deklarieren, damit ich auch im unterprogramm z.b. auf freund[n].geburtsdatum.tag zugreifen kann?
|
Die deklaration der beiden Strukturen sollte global sein, dann kannst du deinem Unterprogramm einen Zeiger auf die erste Person als Parameter uebergeben.
Gruss,
ED _________________ +++++++++++++[>++++>+<<-]>.--.>---. |
|
Nach oben |
|
|
simmizi
Anmeldungsdatum: 28.06.2006 Beiträge: 3
|
Verfasst am: 29. Jun 2006 14:39 Titel: |
|
|
meinst du etwa so:
do
...
while(i<=500 && index!=3)
???
aber gibt es dann nicht das problem, dass erst in die schleife reingelaufen wird und erst zum schluss geprüft wird ob index=3 ist?....also ich meine wenn ich das programm starte nichts passiert, wenn ich 3 eingebe?
für mich war der goto-befehl einfach die einzige möglichkeit aus der switch-menü-schleife herauszuspringen....
ich wollte einfach, dass das menü immer wieder läd und da ich sowas wie eine repeat-schleife in c nicht kenne habe ich einfach einen hohen wert wie hier 500 gewählt, damit das menü immer wieder aufgerufen wird....
kenne mich mit bubblesort überhaupt nicht aus und weiß daher nicht direkt wie ich es auf dieses programm übertragen muss.....muss ich denn im unterprogramm erstmal die geburtsdaten in neue strings kopieren, die dann später sortiert werden?
gruß simmizi |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum nicht herunterladen
|
|