All pastes #393803 Raw Edit

Unnamed

public c v1 · immutable
·published 2007-03-13 21:21 UTC
rendered paste body
/************************************************ * 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 &#65533;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;}