Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- { Visit: http://g-lts.info/ for more code! }
- #include <stdio.h>
- #include <stdlib.h> /* Για να χρησιμοποιήσω την συνάρτηση rand() που παράγει ψευδό-τυχαίους αριθμούς. */
- #include <time.h> /* Για να χρησιμοποιήσω την συνάρτηση time() */
- #define MAX_VALUE 5000
- int createfile(void);
- /*
- Δημιουργεί ένα αρχείο με όνομα data.txt που θα περιέχει 1000 τυχαίες ακέραιες τιμές σε 1000 γραμμές στο διάστημα [0, 5000).
- Επιστρέφει 1 αν εκτελέστηκε σωστά, αλλιώς 0 αν υπήρξε κάποιο πρόβλημα.
- */
- int random_numbers(void);
- /*
- Δημιουργεί ένα ψευδό-τυχαίο αριθμό μεταξύ [0-5000) και τον επιστρέφει. Αν επιστρέψει (-1) τότε υπήρξε κάποιο λάθος.
- */
- int readfile( int arr[] );
- /* Διαβάζει το αρχείο data.txt και το φορτώνει στην μνήμη σε ένα μονοδιάστατο πίνακα των οποίο παίρνει ως παράμετρο. */
- int insertion_sort ( int arr[]);
- /* Συνάρτηση που παίρνει έναν πίνακα ακεραίων και τον ταξινομεί με την μέθοδο της ταξινόμησης με εισαγωγή (Insertion Sort). */
- int selection_sort ( int arr[] );
- /* Συνάρτηση που παίρνει έναν πίνακα ακεραίων και τον ταξινομεί με την μέθοδο της ταξινόμησης με επιλογή (Selection Sort). */
- void clear (void);
- /* Καθαρίζει το input buffer. */
- int print_array ( int arr [] );
- /* Εμφάνιζε όλα τα στοιχεία του πίνακα. */
- void menu (void);
- /* Εμφανίζει το μενού με τις επιλογές - για μέσα στην while-loop. */
- int frequency_table ( int arr[] );
- /* Παίρνει ένα πίνακα που περιέχει όλα τα στοιχεία του αρχείου και κατασκευάζει πίνακα συχνοτήτων που να υπολογίζει πόσες φορές υπάρχει η κάθε μια τιμή μέσα στο αρχείο και το εμφανίζει στην οθόνη.
- ΑΠΑΙΤΉΣΕΙΣ : Ο πίνακας να ΕΊΝΑΙ ταξινομημένος. */
- int main (void)
- {
- srand ( time(NULL) ); /* Για να πλησιάσουμε ακόμη περισσότερο τους τυχαίους αριθμούς. Αλλάζοντας τον σπόρο (seed) της γεννήτριας με την χρήση της srand() που να παίρνει ως παράμετρο όχι έναν σταθερό αριθμό, αλλά την "ώρα του συστήματος". */
- int arr[MAX_VALUE]; /* Ο πίνακας που θα χρειαστώ ούτως σώστε να αποθηκεύσω του αριθμούς. */
- int sort_flag; /* Δείχνει αν έχει γίνει ταξινόμηση των στοιχείων που διάβασε από το αρχείο στον πίνακα που αποθηκεύονται. */
- /* Με νοιάζει για τον αλγόριθμο κατασκευής του πίνακα συχνοτήτων. Στο 0 πάει να πει πως ΔΕΝ είναι ταξινομημένος ο πίνακας.*/
- printf("\n1. Δημιουργία δεδομένων.\n2. Ταξινόμηση δεδομένων με τη μέθοδο της εισαγωγής.\n3. Ταξινόμηση δεδομένων με τη μέθοδο της επιλογής.\n4. Ανάγνωση δεδομένων.\n5. Πίνακας συχνοτήτων.\n6. Έξοδος.\nΕπιλογή : ");
- int ans;
- scanf("%1d", &ans);
- clear();
- while ( ans != 6 ) /* Οτιδήποτε διαφορετικό του 6 ( που είναι η έξοδος ), ελέγχεται.. */
- {
- if ( ans == 1 ) /* Δημιουργία αρχείου με 5000 γραμμές που στην κάθε γραμμή υπάρχει ένας τυχαίος αριθμός στο διάστημα (0,5000] . */
- {
- if ( createfile() )
- printf("OK.\n");
- sort_flag = 0;
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- else if ( ans == 2 ) /* Διάβασμα τιμών από το αρχείο εκχωρώντας τις σε πίνακα && Ταξινόμηση με εισαγωγή. */
- {
- if ( readfile(arr) && insertion_sort(arr) )
- printf("OK.\n");
- sort_flag = 1;
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- else if ( ans == 3 ) /* Διάβασμα τιμών από το αρχείο εκχωρώντας τις σε πίνακα && Ταξινόμηση με επιλογή. */
- {
- if ( readfile(arr) && selection_sort(arr) )
- printf("OK.\n");
- sort_flag = 1;
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- else if ( ans == 4 ) /* Εμφάνιση όλων των στοιχείων του πίνακα στην οθόνη.*/
- {
- print_array(arr);
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- else if ( ans == 5 ) /* Διάβασμα τιμών από τον ταξινομημένο πίνακα && Δημιουργία πίνακα συχνοτήτων. */
- {
- if ( sort_flag )
- if ( frequency_table(arr) )
- printf("OK.\n");
- else
- printf("Τι μπορώ να κάνω εδώ για να μην έχω αυτό το ELSE;; :P .\n");
- else
- printf("O πίνακας δεν είναι ταξινομημένος.\nΑπαιτείται η ταξινόμηση του πίνακα για αυτή την επιλογή.\n");
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- else
- {
- printf("Λάθος επιλογή. Ξανά προσπαθήστε.\n");
- menu (); /* Εμφάνιση μενού επιλογών ξανά. */
- }
- scanf("%1d", &ans);
- clear();
- }
- if ( ans == 6 ) /* Έξοδος προγράμματος. */
- printf("Bye bye! :)\n");
- return 0;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int createfile(void)
- {
- FILE *cref; /* το ΝΕΟ αρχείο */
- cref = fopen("data.txt","w"); /* άνοιγμα για γράψιμο */
- /*========================= Αποκλεισμός σφάλματος =========================*/
- if ( cref == NULL )
- {
- printf("Για κάποιο λόγο δεν επιτευχθεί η δημιουργία του αρχείου data.txt.\n");
- return(0); /* Τελειώνει επιστρέφοντας κάποιο πρόβλημα. */
- }
- /*=========================================================================*/
- int i;
- for (i=0; i<MAX_VALUE; i++)
- fprintf(cref,"%d\n",random_numbers() ); /* Παραγωγή του "τυχαίου" αριθμού και εγγραφή στο αρχείο αφήνοντας και μια γραμμή. ;) */
- fclose(cref); /* Κλείσιμο αρχείου. */
- return 1;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int random_numbers( void )
- {
- return rand() % MAX_VALUE;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int readfile( int arr[] )
- {
- FILE *rf;
- rf = fopen ("data.txt", "r+"); /* Άνοιγμα για διάβασμα. */
- /*========================= Αποκλεισμός σφάλματος =========================*/
- if ( rf == NULL )
- {
- printf("Για κάποιο λόγο δεν επιτευχθεί το άνοιγμα του αρχείου data.txt.\n");
- return(0); /* Τελειώνει επιστρέφοντας κάποιο πρόβλημα. */
- }
- /*=========================================================================*/
- int i;
- for ( i=0; (fscanf( rf, "%d", &arr[i]) != EOF) && (i<MAX_VALUE) ; i++ ) ;
- /* Θα μπορούσα αντί για την EOF να έβαζα -> !feof(rf) */
- fclose(rf);
- return 1;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int insertion_sort ( int arr[] )
- {
- int i;
- /* ======= Αρχικοποίηση χρονομέτρου. ======= */
- clock_t t1, t2;
- t1 = clock();
- /* ========================================= */
- for (i = 1; i < MAX_VALUE; i++) /* Από την δεύτερη ΘΈΣΗ του πίνακα.. έως .. το τέλος. */
- {
- int key = arr[i]; /* Αποθηκεύουμε εδώ προσωρινά το τρέχων ( καινούριο - νέο ) στοιχείο που ελέγχεται. */
- int j = i - 1; /* Το j είναι ο δείκτης που βλέπει ΠΆΝΤΑ -! ΑΡΧΙΚΆ !- μία θέση ΠΡΙΝ το i και θα πηγαίνει προς τα πίσω ΜΌΝΟ.
- Θα βλέπει δηλαδή "αριστερά" του πίνακα. Ο υποπίνακας που βλέπει ο j είναι ο ταξινομημένος προς το παρών. . */
- while ( (j >= 0) && (key < arr[j]) ) /* Όσο ΔΕΝ έχουμε φτάσει στη πρώτη θέση του πίνακα
- && ΌΣΟ το νέο ΝΕΟ στοιχείο που ελέγχεται ( από τον "ΜΗ ταξινομημένο ΥΠΟπίνακα" -που βρίσκεται στα δεξιά- ) είναι ΜΙΚΡΌΤΕΡΟ από το στοιχείο που δείχνει ο δείκτης j που "βλέπει" στον "ταξινομημένο ΥΠΟπίνακα" */
- {
- arr[j + 1] = arr[j]; /* Το περιεχόμενο πάει μια θέση ΔΕΞΙΆ (μπροστά) επειδή θέλουμε αύξουσα ταξινόμηση. */
- j--; /* Πάμε άλλη μια θέση πίσω. */
- }
- arr[j + 1] = key; /* Φτάνει εδώ, όταν το j<0 ( άρα -1 ) οπότε για να γράψει στην πρώτη θέση του πίνακα, πάμε μια θέση μπροστά. ;) */
- }
- /* =========== Τερματισμός χρονομέτρου ============*/
- t2 = clock();
- double elapsed_time = (double) (t2-t1)/CLOCKS_PER_SEC;
- printf("Χρόνος εκτέλεσης : %lf\n", elapsed_time );
- /* =================================================*/
- return 1;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int selection_sort ( int arr[] )
- {
- int i, j;
- int koubas;
- /* ======= Αρχικοποίηση χρονομέτρου. ======= */
- clock_t t1, t2;
- t1 = clock();
- /* ========================================= */
- for (i=0; i<MAX_VALUE; i++) /* Από την αρχή του πίνακα. */
- for (j=i+1; j<MAX_VALUE; j++) /* Από την επόμενη θέση του i και πέρα. */
- if ( arr[i] > arr[j] ) /* Αν βρεθεί j που είναι ΜΙΚΡΌΤΕΡΟ από το i, τότε αντάλλαξε τις τιμές ;) */
- {
- koubas = arr[i]; /* Θα χαθεί το i διότι θέλουμε στην θέση του να βάλουμε ένα μικρότερο. */
- arr[i] = arr[j]; /* Το περιεχόμενο της θέσης j το βάζουμε στην θέση i. */
- arr[j] = koubas; /* Και το περιεχόμενο της θέσης i ( εφόσον είναι μεγαλύτερο ) πάει στην θέση που του αρμόζει */
- }
- /* =========== Τερματισμός χρονομέτρου ============*/
- t2 = clock();
- double elapsed_time = (double) (t2-t1)/CLOCKS_PER_SEC;
- printf("Χρόνος εκτέλεσης : %lf\n", elapsed_time );
- /* =================================================*/
- return 1;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- void clear (void)
- { /* Καθαρισμός μνήμης πληκτρολογίου. */
- while ( getchar() != '\n' );
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int print_array ( int arr [] )
- {
- int i;
- for (i=0; i<MAX_VALUE; i++)
- printf( "Θέση %d -> %d\n", i, arr[i] );
- return 1;
- }
- /*==============================================================================*/
- /*==============================================================================*/
- void menu (void)
- {
- printf("\n1. Δημιουργία δεδομένων.\n2. Ταξινόμηση δεδομένων με τη μέθοδο της εισαγωγής.\n3. Ταξινόμηση δεδομένων με τη μέθοδο της επιλογής.\n4. Ανάγνωση δεδομένων.\n5. Πίνακας συχνοτήτων.\n6. Έξοδος.\nΕπιλογή : ");
- }
- /*==============================================================================*/
- /*==============================================================================*/
- int frequency_table ( int arr[] )
- {
- int fre_array [MAX_VALUE] = {0};
- /* Σε κάθε γραμμή, δηλαδή από 0...5000 εκχωρείται το πόσες φορές υπάρχει ο αριθμός γραμμής μέσα στον πίνακα arr[] .
- Δηλαδή η γραμμή 5 ( το νούμερο 5 δλδ ) υπάρχει 10 φορές, στην γραμμή 6 είναι ο αριθμός 110 ..κ.ο.κ. */
- int i, k;
- for (i=0; i<MAX_VALUE; i++) /* Από την γραμμή 0,1,2,...5000 του πίνακα fre_array */
- {
- k = arr[i]; /* Έτσι βλέπουμε το περιεχόμενο της θέσης, που είναι ένας αριθμός από το 0..5000. Βλέπουμε δλδ ποιος αριθμός είναι. */
- fre_array[k]++; /* Πάμε στην θέση - αριθμό και αυξάνουμε την συχνότητα του. */
- }
- print_array(fre_array); /* Εμφάνιση του πίνακα συχνοτήτων. */
- return 1;
- }
- /*==============================================================================*/
- { Visit: http://g-lts.info/ for more code! }
- /*==============================================================================*/
Advertisement
Add Comment
Please, Sign In to add comment