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

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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.

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define MAX_ANZAHL 10
    4. void sort(int fl[]);
    5. void sort(int fl[])
    6. {
    7. int hilf=0;
    8. int x;
    9. int i;
    10. for(x=0; x<MAX_ANZAHL; x++)
    11. {
    12. for(i=0; i<MAX_ANZAHL-1; i++)
    13. {
    14. if(fl[i+1] < fl[i])
    15. {
    16. hilf=fl[i];
    17. fl[i]=fl[i+1];
    18. fl[i+1]=hilf;
    19. }
    20. }
    21. }
    22. }
    23. int main()
    24. {
    25. FILE*seiten = NULL;
    26. FILE*flaeche = NULL;
    27. int a[MAX_ANZAHL];
    28. int b[MAX_ANZAHL];
    29. int fl[MAX_ANZAHL];
    30. int i;
    31. int hilf;
    32. seiten = fopen("seiten.csv","w");
    33. if(seiten == NULL)
    34. {
    35. printf("unable to write");
    36. exit(-1);
    37. }
    38. for(i=0; i<MAX_ANZAHL; i++)
    39. {
    40. a[i]=rand()%10;
    41. b[i]=rand()%10;
    42. fprintf(seiten,"%d ; %d\n",a[i],b[i]);
    43. }
    44. fclose(seiten);
    45. seiten = fopen("seiten.csv","r");
    46. if(seiten == NULL)
    47. {
    48. printf("unable to read");
    49. exit(-1);
    50. }
    51. flaeche = fopen("flaeche.csv","w");
    52. if(seiten == NULL)
    53. {
    54. printf("unable to write");
    55. exit(-1);
    56. }
    57. for(i=0; i<MAX_ANZAHL; i++)
    58. {
    59. fl[i]=a[i]*b[i];
    60. fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
    61. printf(flaeche,"flaeche: ; %d\n",fl[i]);
    62. }
    63. sort(fl);
    64. fclose(seiten);
    65. fclose(flaeche);
    66. return(0);
    67. }
    Alles anzeigen


    MfG Mr Gibbs
  • 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
  • Danke!
    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?
  • 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:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <math.h>
    4. int main()
    5. {
    6. FILE *Seiten=NULL;
    7. FILE *Flaeche=NULL;
    8. int i=0;
    9. int x=0;
    10. int a=0;
    11. int b=0;
    12. int ergebnis;
    13. Seiten = fopen("Seiten.csv","w");
    14. if(Seiten == NULL)
    15. {
    16. printf("unable to write\n");
    17. exit(-1);
    18. }
    19. for(i=0; i <= 10; i++)
    20. {
    21. a=rand();
    22. b=rand();
    23. fprintf(Seiten,"%d;%d\n", a, b);
    24. }
    25. fclose(Seiten);
    26. Seiten = fopen("Seiten.csv","r");
    27. if(Seiten == NULL)
    28. {
    29. printf("unable to read\n");
    30. exit(-1);
    31. }
    32. Flaeche = fopen("Flaeche.csv","w");
    33. if(Flaeche == NULL)
    34. {
    35. printf("unable to write\n");
    36. exit(-1);
    37. }
    38. while(!feof(Seiten))
    39. {
    40. fscanf(Seiten,"%d;%d\n", &a, &b);
    41. printf("%d -> %d\n", a, b);
    42. ergebnis = a * b;
    43. fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);
    44. }
    45. fclose(Seiten);
    46. fclose(Flaeche);
    47. return (0);
    48. }
    Alles anzeigen
  • Quellcode

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


    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
  • Quellcode

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


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

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

    Ahh da is er ja :D.


    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 :) ^^.
  • 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:

    Quellcode

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


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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mr Gibbs ()

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

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <math.h> // wird hier wahrscheinlich nicht genutzt, teste mal
    4. int main()
    5. {
    6. FILE *Seiten=NULL;
    7. FILE *Flaeche=NULL;
    8. int i=0;
    9. int x=0;
    10. int a=0;
    11. int b=0;
    12. int ergebnis;
    13. Seiten = fopen("Seiten.csv","w"); // warum "w" = write weisst du?
    14. if(Seiten == NULL)
    15. {
    16. printf("unable to write\n"); // das siehst du, wenn nix Datei offen
    17. exit(-1);
    18. }
    19. for(i=0; i <= 10; i++)
    20. {
    21. a=rand(); // einmal im Quelltext srand(), das wäre es
    22. b=rand();
    23. fprintf(Seiten,"%d;%d\n", a, b);
    24. }
    25. fclose(Seiten); // gute Idee, könntest das Dateifüllen auch in eine Funktion auslagern
    26. Seiten = fopen("Seiten.csv","r"); // Seite wird vorbereitet zum lesen
    27. if(Seiten == NULL)
    28. {
    29. printf("unable to read\n"); // das siehtst du, wenn das misslungen ist
    30. exit(-1);
    31. }
    32. Flaeche = fopen("Flaeche.csv","w"); // Fläche wird vorbereitet
    33. if(Flaeche == NULL)
    34. {
    35. printf("unable to write\n"); // sollte inzwischen klar sein
    36. exit(-1);
    37. }
    38. while(!feof(Seiten)) // wie willst du das mit for und der Abbruchbedingung lösen?
    39. {
    40. fscanf(Seiten,"%d;%d\n", &a, &b); // hier wird Zeile für Zeile aus Datei gelesen
    41. printf("%d -> %d\n", a, b);
    42. ergebnis = a * b;
    43. fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis); // hier wird geschrieben - mit Leerzeile?
    44. }
    45. fclose(Seiten);
    46. fclose(Flaeche);
    47. return (0);
    48. }
    Alles anzeigen


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

    MfG bcc-fan
  • 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?

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define MAX_ANZAHL 10
    4. void sort(int fl[]);
    5. void sort(int fl[])
    6. {
    7. int hilf=0;
    8. int x;
    9. int i;
    10. for(x=0; x<MAX_ANZAHL; x++)
    11. {
    12. for(i=0; i<MAX_ANZAHL-1; i++)
    13. {
    14. if(fl[i+1] < fl[i])
    15. {
    16. hilf=fl[i];
    17. fl[i]=fl[i+1];
    18. fl[i+1]=hilf;
    19. }
    20. }
    21. }
    22. }
    23. int main()
    24. {
    25. FILE*seiten = NULL;
    26. FILE*flaeche = NULL;
    27. int a[MAX_ANZAHL];
    28. int b[MAX_ANZAHL];
    29. int fl[MAX_ANZAHL];
    30. int i;
    31. int hilf;
    32. seiten = fopen("seiten.csv","w");
    33. if(seiten == NULL)
    34. {
    35. printf("unable to write");
    36. exit(-1);
    37. }
    38. for(i=0; i<MAX_ANZAHL; i++)
    39. {
    40. a[i]=rand()%10;
    41. b[i]=rand()%10;
    42. fprintf(seiten,"%d ; %d\n",a[i],b[i]);
    43. }
    44. fclose(seiten);
    45. seiten = fopen("seiten.csv","r");
    46. if(seiten == NULL)
    47. {
    48. printf("unable to read");
    49. exit(-1);
    50. }
    51. flaeche = fopen("flaeche.csv","w");
    52. if(seiten == NULL)
    53. {
    54. printf("unable to write");
    55. exit(-1);
    56. }
    57. for(i=0; i<MAX_ANZAHL; i++)
    58. {
    59. fl[i]=a[i]*b[i];
    60. fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
    61. printf("flaeche: ; %d\n",fl[i]);
    62. }
    63. sort(fl);
    64. for(i=0; i<MAX_ANZAHL; i++)
    65. {
    66. fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
    67. printf("%d\n",fl[i]);
    68. }
    69. fclose(seiten);
    70. fclose(flaeche);
    71. return(0);
    72. }
    Alles anzeigen
  • Hab das jetzt nur überflogen.

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

    Dann ändere mal Zeile 39:

    Quellcode

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


    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
  • 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?