/************************************************ * Bubblesort und Funktionszeiger * * In diesem Programm werden Adressen in ein Array geschrieben und nach unterschiedlichen * Kriterien sortiert und ausgegeben. * Die Adressen werden entweder vom User eingegeben oder aus einem File gelesen. * Der User bestimmt dabei zu Beginn des Programms, wie viele Adressen eingelesen werden sollen. * Bei der Eingabe �ber ein File, steht zu Beginn des Files die Anzahl Adressen. * Christina Class **************************************************/#include<stdio.h>#include<string.h>#include<assert.h>#include<stdlib.h>/** Strukturdefinitionen **************************************************/struct name { char name [20]; char vorname [20];};struct strasse { char strasse[20]; int nummer;};struct ort { int plz; char ort[20];};struct adr_typ2 { struct name n; struct strasse s; struct ort o;};/** Information File Struktur *****************************************/void file_info(void){ printf("\n\nDas File ist folgendermassen aufgebaut:\n1. Anzahl Adressen im File"); printf ("\ndann die Adressen in der Reihenfolge Name, Vorname, Strasse, Hausnummer, Postleitzahl und Ort"); printf ("\nnur jeweils durch Whitespace separiert\n\n");}/** Einlesen einer Adresse von der Tastatur *****************************/struct adr_typ2 eingabe (void){ struct adr_typ2 neue_adresse; printf ("Geben Sie den Namen ein: "); scanf ("%19s", neue_adresse.n.name); printf ("Geben Sie den Vornamen ein: "); scanf ("%19s", neue_adresse.n.vorname); printf ("Geben Sie die Strasse ein: "); scanf ("%19s", neue_adresse.s.strasse); printf ("Geben Sie die Hausnummer ein: "); scanf ("%d", &neue_adresse.s.nummer); printf ("Geben Sie die Postleitzahl ein: "); scanf ("%d", &neue_adresse.o.plz); printf ("Geben Sie den Ort ein: "); scanf ("%19s", neue_adresse.o.ort); return neue_adresse;}/** Einlesen aller Adressen via Tastatur **********************************/void eingabe_all (struct adr_typ2 adressen[], int laenge){ int zaehler; for (zaehler = 0; zaehler < laenge; zaehler ++) { printf ("\nEinlesen der %d-ten Adresse: \n",zaehler+1); adressen[zaehler] = eingabe(); }}/** Einlesen einer Adresse aus File ***************************************/struct adr_typ2 eingabe_file (FILE *fp){ struct adr_typ2 neue_adresse; if ((fscanf (fp,"%19s %19s %19s %d %d %19s", neue_adresse.n.name, neue_adresse.n.vorname, neue_adresse.s.strasse, &neue_adresse.s.nummer, &neue_adresse.o.plz, neue_adresse.o.ort)) != 6) file_info(); return neue_adresse;}/** Einlesen aller Adressen aus File *************************************/void eingabe_all_file (struct adr_typ2 adressen[], int laenge, FILE *fp){ int zaehler; for (zaehler = 0; zaehler < laenge; zaehler ++) { printf ("\nEinlesen der %d-ten Adresse",zaehler+1); adressen[zaehler] = eingabe_file(fp); }}/** Ausgabe einer Adresse auf Bildschirm **************************/void ausgabe (struct adr_typ2 adresse){ printf ("%s %s; %s %d; %d %s\n", adresse.n.vorname, adresse.n.name, adresse.s.strasse, adresse.s.nummer, adresse.o.plz, adresse.o.ort);}/** Ausgabe aller Adressen ********************************************/void ausgabe_all (struct adr_typ2 adressen [], int laenge){ int zaehler; printf ("\nDie Adressen:\n"); for (zaehler=0;zaehler<laenge;zaehler++) { printf ("%2d: ", zaehler+1); ausgabe (adressen[zaehler]); }}/** Vergleichsfunktion nach PLZ ************************************/int compare_plz (struct adr_typ2 a, struct adr_typ2 b){ if (a.o.plz > b.o.plz) return 1; else return 0;}/** Vergleichsfunktion nach Name ******************************************/int compare_name (struct adr_typ2 a, struct adr_typ2 b){ if (strcmp (a.n.name, b.n.name) > 0) { return 1; } else { return 0; }}/** Vergleichsfunktion nach Name und Vorname ******************************/int compare_namen (struct adr_typ2 a, struct adr_typ2 b){ if (strcmp (a.n.name, b.n.name) > 0) { return 1; } else if (strcmp (a.n.name, b.n.name) == 0) { if (strcmp (a.n.vorname, b.n.vorname) > 0) { return 1; } else { return 0; } } else return 0;}/** Sortierfunktion *******************************************************/void sortieren (struct adr_typ2 adressen[], int laenge, int (*cmp)(struct adr_typ2, struct adr_typ2)){ struct adr_typ2 temp; int ende = 0; int i; while (!ende) { ende = 1; /* wenn die i-te Zahl groesser ist als die (i+1)-te * dann werden diese beiden Zahlen vertauscht * dann wird ende wieder zu 0 gesetzt, damit das Vertauschen * weitergeht. Dies basiert auf der Annahme, dass * die Zahlen sortiert sind, wenn in einem Durchlauf kein * Zahlenpaar mehr existiert, fuer das gilt: * i-te Zahl ist groesser als (i+1)-te Zahl */ for (i = 0; i < laenge - 1; i++) { if (cmp(adressen[i], adressen[i+1])) { temp = adressen[i]; adressen[i] = adressen[i+1]; adressen[i+1] = temp; ende = 0; } } }}/** main **************************************************************/int main (int argc, char **argv){ struct adr_typ2 *adr; int laenge; if (argc < 2) { printf ("Wie viele Adressen wollen Sie eingeben? "); scanf ("%d", &laenge); assert ((adr = (struct adr_typ2 *) malloc (sizeof (struct adr_typ2) * laenge)) != NULL); eingabe_all (adr, laenge); } else { FILE *fp; assert((fp = fopen(argv[1], "r")) != NULL); if ((fscanf (fp,"%d", &laenge)) != 1) { file_info(); fclose(fp); return 1; } assert ((adr = (struct adr_typ2 *) malloc (sizeof (struct adr_typ2) * laenge)) != NULL); eingabe_all_file (adr, laenge, fp); fclose(fp); } printf ("\n\n"); ausgabe_all (adr, laenge); sortieren (adr, laenge, compare_name); printf ("\n\n"); ausgabe_all (adr,laenge); sortieren (adr, laenge, compare_namen); printf ("\n\n"); ausgabe_all (adr, laenge); sortieren (adr, laenge, compare_plz); printf ("\n\n"); ausgabe_all (adr,laenge); free (adr); return 0;}