Einzelnen Beitrag anzeigen
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 16.03.11, 16:16   #3 (permalink)
Tofuzius
 
Registriert seit: 16.03.11
Tofuzius Leistung: Facit NTK
Likes: 0
Standard

Hi,

bin neu hier. Hab vor gut einem Monat mit Programmieren in C angefangen und bin seither ziemlich süchtig. Bei der Suche nach Aufgaben bin ich auf dieses Forum hier gestoßen. Echt super, dass ihr so etwas anbietet.

Ich fand die Aufgabe ehrlich gesagt überhaupt nicht so leicht. All die Möglichkeiten, wie sich die Rechtecke schneiden können oder wenn gleich mehrere Rechtecke an einer Stelle übereinander lappen. In meiner Lösung kann man auch nur eine festgelegte Menge Rechtecke eingeben, aber ich bin ja auch noch Anfänger.

Hier ist meine Lösung in C:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

struct koordinaten{

    double x;
    double y;
};
struct eckdaten{
    
    double xmin;
    double xmax;
    double ymin;
    double ymax;
};

const int RECHTECKE = 20;
const int MAXE = 10;

void sort(struct koordinaten *array);
double A (struct eckdaten r);
double flaeche_von_schnittmengen(struct eckdaten *r, int durchlaeufe);
struct eckdaten gib_schnittmenge_von(struct eckdaten r, struct eckdaten s);
    
int main()
{
    struct koordinaten ecke[4];
    struct eckdaten rechteck[RECHTECKE];
    int i, j;
    double flaeche, ergebnis, temp;
    char input[MAXE], c;

    flaeche = 0;    
    for (j = 0; j < MAXE; j++){
        printf ("\nGebe die Eckpunkte des %i.ten Rechtecks ein.\n", j + 1);  
        for (i = 0; i < 4; i++){
            printf ("x-Koordinate von Ecke %i: ", i+1);
            ecke[i].x = atoi (fgets (input, MAXE, stdin));
            printf ("y-Koordinate von Ecke %i: ", i+1);
            ecke[i].y = atoi (fgets (input, MAXE, stdin));    
        }
        sort(ecke);
        rechteck[j].xmax = ecke[0].x;
        rechteck[j].xmin = ecke[3].x;
        rechteck[j].ymax = ecke[0].y;
        rechteck[j].ymin = ecke[3].y;
        flaeche += A (rechteck[j]);
        ergebnis = flaeche;        
        ergebnis -= flaeche_von_schnittmengen(rechteck, j); 
        printf ("Die mit den Rechtecken bedeckte Flaeche betraegt: %f\n", ergebnis);        
        printf("Noch ein Rechteck?\n");
        while (1){
            printf("J fuer Ja oder N fuer Nein: ");
            c = (char)toupper(getchar());
            while (getchar() != '\n');
            if (c == 'J' || c == 'N')
                break;
        }
        if (c == 'N')
            j = MAXE;         
    }
        
    return 0;
}

void sort(struct koordinaten *array){
//soritert varaiblen vom Typ struct koordinaten vor für die Übergabe in Typ struct eckdaten.

    int i, j;
    struct koordinaten temp;
    
    for (i = 0; i < 4; i++){
        for (j = i + 1; j < 4; j++){
            if (array[i].x < array[j].x){
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    if (array[0].y < array[1].y)
        array[0] = array[1];
    if (array[2].y < array[3].y)
        array[3] = array[2];
}        
double A (struct eckdaten r){
// berechnet Flaechninhalt

    double breite, laenge, a;
    
    breite = r.ymax - r.ymin;
    laenge = r.xmax - r.xmin;
    a = breite * laenge;

    return a;    
}
double flaeche_von_schnittmengen(struct eckdaten *r, int durchlaeufe){    
// summiert Schnittmengen und subtrahiert mehrfache Schnittmengen

   	int i, j, k;	
	double a, m;
	struct eckdaten schnitt[MAXE];

	a = 0; m = 0; k = 0;	

	for (i = 0; i < durchlaeufe; i++){
		for (j = i + 1; j <= durchlaeufe; j++){
				schnitt[k] = gib_schnittmenge_von(r[i], r[j]);
				m = A (schnitt[k]);
				if (m == 0){
					schnitt[k] = gib_schnittmenge_von(r[j], r[i]);
					m = A (schnitt[k]);
				}
				if (m != 0)
					k++;
				a += m;
		}
	printf("\n");
		a -=  flaeche_von_schnittmengen(schnitt, (durchlaeufe - 1));
	}
	return a;
}

struct eckdaten gib_schnittmenge_von(struct eckdaten r, struct eckdaten s){
// ermittelt Art der Schnittmenge und gibt entsprechende Eckdaten zurueck
	int a;
	struct eckdaten schnitt; 

	a = 0;
	//Links-Unten drin
	if (r.xmin >= s.xmin && r.xmin < s.xmax){
		if (r.ymin >= s.ymin && r.ymin < s.ymax)
			a += 1;
	}
	//Rechts-Oben drin
	if (r.xmax <= s.xmax && r.xmax > s.xmin){
		if (r.ymax <= s.ymax && r.ymax > s.ymin)
			a += 10;
	}
	//Links-Oben drin
	if (r.xmin >= s.xmin && r.xmin < s.xmax){
		if (r.ymax <= s.ymax && r.ymax > s.ymin)
			a += 100;
	}
	//Rechts-Unten drin
	if (r.xmax <= s.xmax && r.xmax > s.xmin){
		if (r.ymin >= s.ymin && r.ymin < s.ymax)
			a += 1000;
	}  
	// schnitt ohne Ecken drin
	if (r.xmin >= s.xmin && r.xmin < s.xmax){
		if (r.xmax <= s.xmax && r.xmax > s.xmin)
			if (s.ymin >= r.ymin && s.ymin < r.ymax)	
				if (s.ymax <= r.ymax && s.ymax > r.ymin)
			a = 2;
	}
	printf("case %i", a);
	switch (a){
		case 1:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = s.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = s.ymax;
			break;
		case 2:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = s.ymin;
			schnitt.ymax = s.ymax;
			break;
		case 10:
			schnitt.xmin = s.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = s.ymin;
			schnitt.ymax = r.ymax;
			break;
		case 1111:		//11 == 111 == 1011 == 1111
		case 1100:
		case 1101:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = r.ymax;
			break;
		case 100:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = s.xmax;
			schnitt.ymin = s.ymin;
			schnitt.ymax = r.ymax;
			break;
		case 101:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = s.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = r.ymax;
			break;
		case 110:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = s.ymin;
			schnitt.ymax = r.ymax;
			break;
		case 1000:
			schnitt.xmin = s.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = s.ymax;
			break;
		case 1001:
			schnitt.xmin = r.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = s.ymax;
			break;
		case 1010:
			schnitt.xmin = s.xmin; 
			schnitt.xmax = r.xmax;
			schnitt.ymin = r.ymin;
			schnitt.ymax = r.ymax;
			break;
		default:
			schnitt.xmin = 0; 
			schnitt.xmax = 0;
			schnitt.ymin = 0;
			schnitt.ymax = 0;
	}
	return schnitt;
}

Geändert von Tofuzius (17.03.11 um 07:35 Uhr) Grund: Hab noch Fehler in den Funktionen flaeche_von_schnittmengen und gib_schnittmenge_von gefunden und behoben.
Tofuzius ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61