Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

geburtsdatum mit bubblesort sortieren

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
simmizi



Anmeldungsdatum: 28.06.2006
Beiträge: 3

BeitragVerfasst am: 28. Jun 2006 13:56    Titel: geburtsdatum mit bubblesort sortieren Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ED209



Anmeldungsdatum: 30.05.2005
Beiträge: 122

BeitragVerfasst am: 28. Jun 2006 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
simmizi



Anmeldungsdatum: 28.06.2006
Beiträge: 3

BeitragVerfasst am: 28. Jun 2006 20:25    Titel: Antworten mit 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....

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
Benutzer-Profile anzeigen Private Nachricht senden
ED209



Anmeldungsdatum: 30.05.2005
Beiträge: 122

BeitragVerfasst am: 29. Jun 2006 12:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
simmizi



Anmeldungsdatum: 28.06.2006
Beiträge: 3

BeitragVerfasst am: 29. Jun 2006 14:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++ Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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