You are not logged in.

  • Login

1

Friday, May 6th 2011, 6:39pm

Flaeche sortieren nach Größe und dann in eine File speichern/ausgeben

Hallo,

ich hab hier ein Programm das Flaechen ausrechnet die sie dann sortiert und dann in eine File ausgeben soll.
Tut es aber nicht ganz.
Das sortieren müsste ja stimmen nur weis ich nicht wo ich das Unterpogramm ins Main-Programm schreiben soll.

Source code

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdlib.h>

#define MAX_ANZAHL 10

void sort(int fl[]);
void sort(int fl[])
{
  int hilf=0;
  int x;
	int i;

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

int main()
{
  FILE*seiten = NULL;
	FILE*flaeche = NULL;

	int a[MAX_ANZAHL];
	int b[MAX_ANZAHL];
	int fl[MAX_ANZAHL];
	int i;
	int hilf;
	

	seiten = fopen("seiten.csv","w");
  if(seiten == NULL)
	{
	  printf("unable to write");
		exit(-1);
	}

	for(i=0; i<MAX_ANZAHL; i++)
	{
	  a[i]=rand()%10;
		b[i]=rand()%10;
		fprintf(seiten,"%d ; %d\n",a[i],b[i]);
	}
	fclose(seiten);

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

	flaeche = fopen("flaeche.csv","w");
	if(seiten == NULL)
	{
	  printf("unable to write");
		exit(-1);
	}
  
	for(i=0; i<MAX_ANZAHL; i++)
	{
	  fl[i]=a[i]*b[i];
		fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
		printf(flaeche,"flaeche: ; %d\n",fl[i]);
	}
	sort(fl);
  fclose(seiten);
	fclose(flaeche);
	
	return(0);
}


MfG Mr Gibbs

2

Friday, May 6th 2011, 8:31pm

Kann sein das ich heut Abend schon zu müde bin ;)

Du könntest die main in mehrere logische Funktionen aufteilen.
Beispiel: Erstelle_Seitenpaare ...
Da dran denken, wenn du rand() initialisierst, ist das mit dem Zufall ein wenig mehr.

Wo liest du die Daten aus der "seiten.csv"?
Oder ist das für einen Projekterweiterung?

Das Sortieren ruftst du ja schon auf - nur, wenn das Ergebnis in einer Datei stehen soll, musst du es schon reinschreiben ;)

MfG bcc-fan

3

Saturday, May 7th 2011, 8:54am

Danke!

Quoted

Wo liest du die Daten aus der "seiten.csv"?


Naja, so weit ich weis liest man mit einem fscanf Daten aus oder?
Dies habe ich aber nicht.
Könntet ihr mir ein erklären wie man das fscanf richtig benutzt. Vielleicht in einem simplen Bsp-Programmm?

PS: Könnt ihr mir ein paar einfache Übungen zum File input output nennen, die ich dann programmieren kann?

4

Saturday, May 7th 2011, 12:16pm

Nicht nur mit fscanf, je nach Anwendung kann man auch fread oder fgets benutzen.

fscanf -> wird wie scanf verwendet nur die Daten kommen aus einer Datei
fread -> liest Daten aus einer Datei
fgets -> liest eine Zeile aus der Datei
Beispiel sind auf den Seiten vorhanden.

Mfg Rushh0ur

5

Saturday, May 7th 2011, 12:44pm

Hier auch noch was:
http://www.wpollock.com/CPlus/PrintfRef.htm

So ausführlich findet man das nicht so oft.
Es sind da teilweise nur Codesnipsel <- die sollten natürlich entsprechend ergänzt werden.

MfG bcc-fan

6

Saturday, May 7th 2011, 1:54pm

Danke.

Sorry bcc, aber in English geht gar nichts^^.
Rushhour der link mit fscanf funktioniert nicht.
Also ich hab hier jetzt ein Programm das am Schluss eine while hat. Für was braucht man jetzt da das fscanf? ---> ich kann ja das auch mit einer ganz normale for schreiben ohne fscanf. Warum dann die while?

Programm:

Source code

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
#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);
}

7

Saturday, May 7th 2011, 4:24pm

C/C++ Quellcode

1
2
3
4
5
6
7
while(!feof(Seiten))   // Text in folgender geschweifter Klammer wird solange wiederholt bis feof = "file end of file" 
	{
		fscanf(Seiten,"%d;%d\n", &a, &b);  // liest zeilenweise aus Seiten
		printf("%d -> %d\n", a, b);
                ergebnis = a * b;
		fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);  // schreibt in Fläche
	}


Wie gross sind deine Flächen, wenn du dein Programm mehrfach startest?
Kommen da immer die selben "Zufallszahlen"?

Beim Quelltext hast du noch nicht den C&C++ Button gefunden ;)

Wie du an dem Kommentar im Quelltext siehst, wer beim Englisch lernen auf der Bremse steht, hat es beim programmieren schwerer ;)
Versuch mal deine Bremse zu lösen, wenn du programmieren möchtest :D

MfG bcc-fan

8

Saturday, May 7th 2011, 4:30pm

Source code

1
2
Wie gross sind deine Flächen, wenn du dein Programm mehrfach startest?
Kommen da immer die selben "Zufallszahlen"?


Ja es sind immer die gleichen, aber das kann man ja mit srand lösen oder?

Quoted

Beim Quelltext hast du noch nicht den C&C++ Button gefunden ;)

Ahh da is er ja :D.

Quoted


Wie du an dem Kommentar im Quelltext siehst, wer beim Englisch lernen auf der Bremse steht, hat es beim programmieren schwerer ;)
Versuch mal deine Bremse zu lösen, wenn du programmieren möchtest :D


Jep da muss ich was machen :) ^^.

9

Saturday, May 7th 2011, 4:34pm

Dann löse das mit srand() und dem je nach Compiler erforderlichen zusätzlichen Header.

MfG bcc-fan

10

Saturday, May 7th 2011, 5:09pm

Ja wenn man mit fscanf ausliest.
Was macht man dann mit "r" da liest man ja auch?

Was ist nun der Unterschied?

statt while kann man ja ne for auchnehmen:

C/C++ Quellcode

1
2
3
4
5
6
for(i=0; i<MAX_ANZAHL; i++)
	{
	  fl[i]=a[i]*b[i];
		fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
		//printf("flaeche: ; %d\n",fl[i]);
	}


für was muss ich jetzt a und b auslesen?
Das Auslesen mach ich eh schon mit "r"?

This post has been edited 1 times, last edit by "Mr Gibbs" (May 7th 2011, 5:19pm)


11

Saturday, May 7th 2011, 5:40pm

Gesteht, wo hast du den Quelltext her ;)
Sieht zwar aus wie von einem Newby, aber deine Fragen :rolleyes:

C/C++ Quellcode

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>  // wird hier wahrscheinlich nicht genutzt, teste mal
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");  // warum "w" = write weisst du?
	if(Seiten == NULL)  
	{
		printf("unable to write\n"); // das siehst du, wenn nix Datei offen
		exit(-1);
	}
	for(i=0; i <= 10; i++)
	{
		a=rand();  // einmal im Quelltext srand(), das wäre es
		b=rand();
		fprintf(Seiten,"%d;%d\n", a, b);
	} 
	fclose(Seiten); // gute Idee, könntest das Dateifüllen auch in eine Funktion auslagern
 
	Seiten = fopen("Seiten.csv","r"); // Seite wird vorbereitet zum lesen
	if(Seiten == NULL)
	{
		printf("unable to read\n"); // das siehtst du, wenn das misslungen ist
		exit(-1);
	}
        Flaeche = fopen("Flaeche.csv","w");  // Fläche wird vorbereitet
	if(Flaeche == NULL) 
	{
		printf("unable to write\n");  // sollte inzwischen klar sein
		exit(-1);
	}
 
	while(!feof(Seiten))  // wie willst du das mit for und der Abbruchbedingung lösen?
	{
		fscanf(Seiten,"%d;%d\n", &a, &b);  // hier wird Zeile für Zeile aus Datei gelesen
		printf("%d -> %d\n", a, b);
                ergebnis = a * b;
		fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);  // hier wird geschrieben - mit Leerzeile?
	}
	fclose(Seiten);
	fclose(Flaeche);
	return (0);
}


Okay, es geht auch mit for. Aber warum willst du es dir schwerer machen? ;)

MfG bcc-fan

12

Saturday, May 7th 2011, 6:28pm

Ok. Guck das Programm(die flaeche sind halt jetzt sortiert, aber das jetzt unwichtig :)) das jetzt kommt ^^.
Das ist mit For und das versteh ich viel einfacher.

Ich erkläre mal das Programm und du sagst dann was du davon hältst^^.
Also: Ich schreibe die verschieden Zufallszahlen auf einen 1. Zettel mit fopen(...."w") ----> Ich legen den Zettel weg also flclose(.....). Ich denke mir: Na toll jetzt hab ich die "Zufallszahlen" vergessen :D. *Gedankenblitz* Ich hole mir den 1. Zettel wieder und LESE ihn durch: fopen(....."r"). Jetzt nehme ich einen neune Zetteln den 2. während der 1. Zettel nicht geclost ist kann ich die werten für a und b ABLESEN und SCHREIBE dann das Ergebnis auf den 2. Zettel.

Für was also ein fscanf^^.
Könntest du bitte das gleiche Programm machen nur mit while und fscanf?

C/C++ Quellcode

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_ANZAHL 10
 
void sort(int fl[]);
void sort(int fl[])
{
  int hilf=0;
  int x;
 int i;
 
 for(x=0; x<MAX_ANZAHL; x++)
 {
   for(i=0; i<MAX_ANZAHL-1; i++)
  {
    if(fl[i+1] < fl[i])
   {
     hilf=fl[i];
     fl[i]=fl[i+1];
     fl[i+1]=hilf;
   }
  }
 }
}
 
int main()
{
 FILE*seiten = NULL;
 FILE*flaeche = NULL;
 
 int a[MAX_ANZAHL];
 int b[MAX_ANZAHL];
 int fl[MAX_ANZAHL];
 int i;
 int hilf;
 
 
 seiten = fopen("seiten.csv","w");
  if(seiten == NULL)
 {
   printf("unable to write");
  exit(-1);
 }
 
 for(i=0; i<MAX_ANZAHL; i++)
 {
   a[i]=rand()%10;
  b[i]=rand()%10;
  fprintf(seiten,"%d ; %d\n",a[i],b[i]);
 }
 fclose(seiten);
 
 seiten = fopen("seiten.csv","r");
  if(seiten == NULL)
 {
   printf("unable to read");
  exit(-1);
 }
 
 flaeche = fopen("flaeche.csv","w");
 if(seiten == NULL)
 {
   printf("unable to write");
  exit(-1);
 }
 
  for(i=0; i<MAX_ANZAHL; i++)
 {
    fl[i]=a[i]*b[i];
    fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
    printf("flaeche: ; %d\n",fl[i]);
 }
 sort(fl);
 for(i=0; i<MAX_ANZAHL; i++)
 {
  fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
  printf("%d\n",fl[i]);
 
 }
 
 
 fclose(seiten);
 fclose(flaeche);
 
 return(0);
}

13

Saturday, May 7th 2011, 8:52pm

Hab das jetzt nur überflogen.

Mach mal folgendes rufe dein letztes Programm auf und schau was das ausgibt.

Dann ändere mal Zeile 39:

C/C++ Quellcode

1
2
3
4
5
6
seiten = fopen("seiten.csv","a");  // hier a statt w
  if(seiten == NULL)
 {
   printf("unable to write");
  exit(-1);
 }


Und rufe dein Programm nach der Änderung erneut auf und schau dir das Ergebnis an.
Schau dir dann auch an was bei dir anschliessend in der "seiten.csv" steht.

Die .csv zwischen den Aufrufen nicht bearbeiten oder löschen ;)

Hab das so aus den Ärmel, hoffe mal das das nicht vom Compiler abhängig ist.

MfG bcc-fan

14

Sunday, May 8th 2011, 8:30am

Mhm,...
Bei seiten.csv kommen jetzt die gleich Seiten unten dazu geschrieben.
flaech.csv bleibt gleich.

15

Sunday, May 8th 2011, 9:06am

So und nun änderst du in Zeile 61 auch "w" zu "a".

Und schaust dir das Ergebnis an.

MfG bcc-fan

16

Sunday, May 8th 2011, 9:54am

Jetzt gibt es in seiten.csv 3mal die selben Zahlen aus.
Und bei flaeche.csv kommen: Als 1. die unsortierten Flaechen dann die sortierten und dann wieder die unsortierten und wieder die sortierten.

Warum vermehrfacht sich das? a ---> append-----> hinzufügen

Trotzdem vesteh ich den Trick noch nicht ganz^^.
Was hat das jetzt gebracht?

17

Sunday, May 8th 2011, 10:05am

So willst ja lernen, oder ? ;)

So jetzt teste das auch mal mit for so wie du das vorhattest und mit while so wie du das gefunden hattest. ;)

MfG bcc-fan

18

Sunday, May 8th 2011, 11:39am

Ich glaub ich hab die Lösung gefunden :D.

Beim Programm mit den Arrays da bruacht man ja überhaupt kein "r", weil ja ein array merkt sich ja die Werte kann man sagen oder?
Und fscanf liest nur heraus wenn man sich im Lesen-Modus befindet oder? z.b: w+,r,a+...

19

Sunday, May 8th 2011, 4:37pm

Du und deine lausigen Englischkenntnisse ;)
w -> Datei vorbereiten zum Schreiben
a -> Datei vorbereiten zum Daten Anhängen
r -> Datei vorbereiten zum Lesen

Hier noch Kombinationen, wenn z.b: w+, a+ oder r+ da steht:
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

MfG bcc-fan

20

Monday, May 9th 2011, 6:30pm

Ok danke für alles :D.

Hättet ihr oder du^^ noch ein paar Übungen für mich die ich machen könnte? Also von der Schwierigkeit her wie die Programme die wir die ganze Zeit besprechen hier im Forum.

MfG Mr Gibbs

Similar threads

Social bookmarks