Flaeche sortieren(File I/O)

C_Boy

Mitglied
Morgen zusammen,

Das Programm sortiert Flaechen, die es dann in eine File ausgibt(z.B. Excel).
Ich hab das Programm mit "w"(write) und "r"(read) geschrieben, aber es geht auch ohne "w"?
Mir ist noch nicht ganz klar für was ich "w" unr "r" genau brauche und wie ich es genau schreiben soll (Reihenfolge etc.).
Vielleicht kann man ja auch wegen dem sortieren was verbessern.


Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_ANZAHL 10

float generate(int a[], int b[], int flaeche[]);
float generate(int a[], int b[], int flaeche[])
{
	int i=0;
  for(i=0; i<MAX_ANZAHL; i++)
	{
	  a[i]=rand()%10;
		b[i]=rand()%10;
		flaeche[i]=a[i]*b[i];
	}
}


float sort(int flaeche[]);
float sort(int flaeche[])
{
  int hilf=0;
	int x=0;
	int i=0;

	for(x=0; x<MAX_ANZAHL; x++)
	{
	  for(i=0; i<MAX_ANZAHL-1; i++)
		{
		  if(flaeche[i]>flaeche[i+1])
			{
			  hilf=flaeche[i];
				flaeche[i]=flaeche[i+1];
				flaeche[i+1]=hilf;
			}
		}
	}
}

int main()
{
  FILE * sortflaeche=NULL;

  int flaeche[MAX_ANZAHL];
	int a[MAX_ANZAHL];
	int b[MAX_ANZAHL];
	int i=0;
	

	sortflaeche = fopen("flaeche.csv","r");
	if(sortflaeche == NULL)
	{
	  printf("unable to read");
		exit(-1);
	}
        fclose(sortflaeche)        

	sortflaeche = fopen("flaeche.csv","w");
	if(sortflaeche == NULL)
	{
	  printf("unable to write");
		exit(-1);
	}
	generate(a,b,flaeche);
	sort(flaeche);

	for(i=0; i<MAX_ANZAHL; i++)
	{  
		fprintf(sortflaeche,"flaeche[%d] ; %d\n",i,flaeche[i]);
	}

	fclose(sortflaeche);
	return 0;
}

LG C_boy
 
Zuletzt bearbeitet:
Hi

Zum fopen: "r" bedeutet, das du aus der angegebenen Datei etwas ins Programm einlesen willst.
Die Datei ändern geht dabei nicht.
"w" dagegen ist nur zum Schreiben. Falls es die Datei zuerst noch nicht gegeben hat, wird sie neu erstellt (mit dem, was du reinschreibst), falls sie aber schon existiert hat, wird sie einfach überschrieben.
Außer "r" und "w" gibt es an wichtigen Dingen noch "a" (Neu erstellen oder - wenn vorhanden - nicht überschreiben, sondern das Neue hinten anhängen) und verschiedene Kombinationen aus den drei Möglichkeiten.

In dienem Programm brauchst du den w-Teil, da du ja was in die Datei schreiben willst.
Der r-Teil dagegen ist völlig überflüssig.
Wozu soll der gut sein?
Du öffnest eine Datei und gibst an, das du was rauslesen willst.
Wenn das Öffnen nicht funktioniert hat, gibts eine Fehlermeldung, sonst schließt du die Datei sofort wieder, ohne auch nur irgendwas herausgelesen zu haben

Der ganze Teil da:
C++:
sortflaeche = fopen("flaeche.csv","r");
if(sortflaeche == NULL)
{
  printf("unable to read");
  exit(-1);
}
fclose(sortflaeche);
kann weg.

Punkt 2:
Diese Zeile da:
C++:
float sort(int flaeche[]);
macht nur dann Sinn, wenn die Funktion selber wo anders ist.
Da sie aber gleich eine Zeile darunter steht, musst du Namen/Parameter/etc nicht zweimal angeben, einmal reicht völlig aus.
Das Selbe gilt für generate.

Und zum sort:
Naja.
Funktionieren wirds schon, und bei einer kleinen Anzahl (wie 10 bei dir) ist das so kein Problem.
Solltest du aber vorhaben, MAX_ANZAHL irgendwann auf eine Milliarde oder so zu erhöhen, viel Spaß.
Das Sortierten wird mit deiner Methode zeitmäßig ewig dauern.
Falls du also irgendwann mehr als 10 (oder 1000) Elemente sortieren willst, würde es sich lohnen, einen anderen Sortieralgorithmus reinzuprogrammieren.
Einer der bekanntesten ist zB der sog. Quicksort.
Ansonsten Heapsort, Introsort (noch eine Spur schneller als Quicksort, aber nicht ganz so einfach zu programmieren)....

Gruß
 
Zuletzt bearbeitet:
Jep ist eine Schulaufgabe...
Die nächste wäre dann ein Programm mit Quicksort schreiben wie Matthias sagte :D.
 
Ok danke.

Ich hab hier ein Programm mit "w" und "r" kannst du mir das mit diesem Programm erklären bitte?

Und vielleicht auch vergleich mit dem vorigen.

Dieses gibt jetzt die laengen in ein eigenes Dokument und die Flaechen(ohne sort).

Kann es sein das man das "r" bei 2 Files braucht? Oder kann man das bei einer auch verwenden?

Was hat es mit der while auf sich braucht man die bei jedem fopen Programm(solange die File nicht zuende ist wird die File ausgeführt)?
Warum macht man die 2. File mitten in der 1. File auf(fopen)?

C++:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
	FILE *Seiten=NULL;
	FILE *Flaeche=NULL;
	int i=0;
	int x=0;
	int a=0;
	int b=0;
	int ergebnis;
	
	

	Seiten = fopen("Seiten.csv","w");  
	if(Seiten == NULL)  
	{
		printf("unable to write\n");
		exit(-1);
	}
	for(i=0; i <= 10; i++)
	{
		a=rand();
		b=rand();
		fprintf(Seiten,"%d;%d\n", a, b);
	} 
	fclose(Seiten);

	Seiten = fopen("Seiten.csv","r");
	if(Seiten == NULL)
	{
		printf("unable to read\n");
		exit(-1);
	}
  Flaeche = fopen("Flaeche.csv","w");  
	if(Flaeche == NULL)  
	{
		printf("unable to write\n");
		exit(-1);
	}

	while(!feof(Seiten))
	{
		fscanf(Seiten,"%d;%d\n", &a, &b);
		printf("%d -> %d\n", a, b);
    ergebnis = a * b;
		fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);
	}
	fclose(Seiten);
	fclose(Flaeche);
	return (0);
}
 
Zuletzt bearbeitet von einem Moderator:
Kann es sein das man das "r" bei 2 Files braucht? Oder kann man das bei einer auch verwenden?

Mir ist da nicht ganz klar, was du vorhast.
Ist es wirklich so schwer, das r aus der Datei was rausholt und w was reinschreibt?

Beim ersten Programam hast du zuerst zufällige Zahlen gamacht, diese sortiert und dann in eine Datei geschrieben.

Das zweite Programm:
1) Erzeugt zufällige Zahlen, die in der Datei Seiten.csv gespeichert werden
2) Schaut sich die Werte daraus nocheinmal an und multipliziert immer zwei Zahlen, um das Ergebnis in eine weitere Datei zu schreiben.

Was genau verstehst du da an r und w nicht?
Ist doch das Gleiche wie mit einem Buch.
w ist der Autor, der sich zuerst den Inhalt ausdenkt und dann aufschreibt.
r liest sich das dann durch.

Um das aufs Programm zu übertragen:
Zuerst denkst du dir Längen und Breiten für Rechtecke aus und schreibst sie auf.

Dann liest du dir nacheinander jedes Längen/Breiten-Paar durch, rechnest daraus den Flächeninhalt aus und schreibst ihn auf einen neuen Zettel. Das Ganze für jedes Rechteck, nacheinander.
Länge und Breite vom ersten Zettel lesen, ausrechnen, Fläche auf den anderen Zettel aufschreiben.
 
Im 1. Programm braucht man kein "r". Nur ein "w".

Im 2. Programm braucht man ein "r" und ein "w". Weil man sich ja zuerst die Laengen aufschreibt und dann mit "r" liest was da überhaupt steht und dann ausrechnet.

Wenn man im 1. Programm das in 2 Dokumente teil(1 fuer Laenge und 1 für sortierete Flaechen), dann braucht man auch wieder ein "r". Stimmts?

Kann man dann also sagen das man nur bei einem Dokument kein "r" braucht?
Wenn das nicht Stimmt nenn mir ein Bsp bitte.
 
Kann man dann also sagen das man nur bei einem Dokument kein "r" braucht?
Warum? Kommt immer darauf an, was du machen willst.

Du solltest dich von der Illusion verabschieden, das alles nach dem gleichen Schema wie dein Programm abläuft.
Wenn du Zufallszahlen in eine Datei SCHREIBEN willst: w
Wenn du den Inhalt einer Datei im Programm haben möchtest: r

Wenn du mit Word ein Dokument aufmachst willst du es ja auch lesen können, und nicht, dass es gelöscht wird?
Wenn Word w nehmen würde ist das Dokument weg. Datei leer und bereit zum neu reinschreiben.

Stell dir eine Datei einfach wie ein Blatt Papier vor.
Mit r kannst du die Schrift darauf lesen, mit w radierst du alles, was eventuell schon da war, weg und kannst das Blatt beschreiben.
 
Ok jetzt versteh ichs.

Aber bei meinem 2. Programm check ich immer nicht:
Man mach die "Seiten" zum lesen auf und dann öffnen man die Flaechen zum schreiben.
Also wird die Flaeche dann zwischen Seiten = fopen("Seiten.csv","r"); und fclose(Seiten) geschrieben.

Kann man fopen("Seiten.csv","r") und dann fclose. Und dann Flaeche = fopen("Flaeche.csv","w") und dann fclose. Oder muss Flaeche = fopen("Flaeche.csv","w") in Seiten = fopen("Seiten.csv","w") reinschreiben - Warum?
C++:
 while(!feof(Seiten))
    {
        fscanf(Seiten,"%d;%d\n", &a, &b);
        printf("%d -> %d\n", a, b);
    ergebnis = a * b;
        fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);
    }

Warum schreibt man in der while "Seiten" hinein ich wäre da nicht darauf gekommen?
Muss man NUR in de while ausgeben?

Im 1. Programm hab ich ja gar keine while?
 
Zuletzt bearbeitet:
Zurück