Η πρότυπη βιβλιοθήκη

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή

Είσοδος και έξοδος

Επικεφαλίδα

#include <stdio.h>

Περιλαμβάνει

Συναρτήσεις για είσοδο και έξοδο στοιχείων και επεξεργασία αρχείων.

Βασικές συναρτήσεις

fopen
Επιστρέφει ένα ρεύμα (stream) για την επεξεργασία ενός αρχείου.
fclose
Τερματίζει την επεξεργασία ενός αρχείου.
printf
Τυπώνει φορμαρισμένα στην έξοδο (stdout).
fprintf
Τυπώνει φορμαρισμένα σε αρχείο.
sprintf
Τυπώνει φορμαρισμένα σε συμβολοσειρά.
fscanf
Διαβάζει φορμαρισμένα από αρχείο.
scanf
Διαβάζει φορμαρισμένα από την είσοδο (stdin).
getc
Διαβάζει έναν χαρακτήρα από αρχείο.
getchar
Διαβάζει έναν χαρακτήρα από την είσοδο.
putc
Τυπώνει έναν χαρακτήρα σε αρχείο.
putchar
Τυπώνει έναν χαρακτήρα στην έξοδο.
fread
Διαβάζει στοιχεία από το αρχείο.
fwrite
Τυπώνει στοιχεία στο αρχείο.
fseek
Ορίζει τη θέση στο αρχείο

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει τα περιεχόμενα του αρχείου test.c:
#include <stdio.h>

main()
{
        FILE *f;
        int c;

        f = fopen("test.c""r");
        while ((c = getc(f)) != EOF)
                putchar(c);
}

Χαρακτηρισμός χαρακτήρων

Επικεφαλίδα

#include <ctype.h>

Περιλαμβάνει

Συναρτήσεις που χαρακτηρίζουν τον είδος ενός χαρακτήρα.

Βασικές συναρτήσεις

isdigit
Επιστρέφει αληθές αν ο χαρακτήρας είναι ψηφίο
isalpha
Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός
isalnum
Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός ή ψηφίο
isspace
Επιστρέφει αληθές αν ο χαρακτήρας είναι κάποιο κενό
isupper
Επιστρέφει αληθές αν ο χαρακτήρας είναι κεφαλαίος
islower
Επιστρέφει αληθές αν ο χαρακτήρας είναι πεζός
Οι παραπάνω συναρτήσεις σε πολλές υλοποιήσεις δεν υποστηρίζουν τους ελληνικούς χαρακτήρες.

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει τον αριθμό των ψηφίων, πεζών και κεφαλαίων χαρακτήρων που συναντά στην είσοδό του.
#include <stdio.h>
#include <ctype.h>

main()
{
        int c;
        int digits, upper, lower;

        digits = upper = lower = 0;
        while ((c = getchar()) != EOF) {
                if (isdigit(c))
                        digits++;
                if (isupper(c))
                        upper++;
                if (islower(c))
                        lower++;
        }
        printf("digits = %d\n", digits);
        printf("upper = %d\n", upper);
        printf("lower = %d\n", lower);
}

Μαθηματικά

Επικεφαλίδα

#include <math.h>

Περιλαμβάνει

Μαθηματικές συναρτήσεις σε αριθμούς κινητής υποδιαστολής (double)

Βασικές συναρτήσεις

sin
Ημίτονο
cos
Συνημίτονο
tan
Εφαπτομένη
asin
Τόξο ημίτονου
acos
Τόξο συνημίτονου
atan2
Τόξο εφαπτομένης
sinh
Υπερβολικό ημίτονο
cosh
Υπερβολικό συνημίτονο
log
Φυσικός λογάριθμος
pow
Δύναμη
sqrt
Τετραγωνική ρίζα
ceil
Στρογγυλεύει προς τα άνω
floor
Στρογγυλεύει προς τα κάτω
fmod
Υπόλοιπο διαίρεσης

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει 3.1415...
#include <stdio.h>
#include <math.h>

main()
{
        printf("%g\n"2.0 * asin(1.0));
}

Βοηθητικές συναρτήσεις

Επικεφαλίδα

#include <stdlib.h>

Περιλαμβάνει

Συναρτήσεις μετατροπής αριθμών, χρήσης δυναμικής μνήμης (βλ. δυναμική διάθεση μνήμης), λειτουργίας στο περιβάλλον του λειτουργικού συστήματος και χρήσης ταξινομημένων πινάκων.

Βασικές συναρτήσεις

atof
Μετατρέπει συμβολοσειρά σε double
atol
Μετατρέπει συμβολοσειρά σε long
atoi
Μετατρέπει συμβολοσειρά σε int
abs
Επιστρέφει την απόλυτη τιμή ενός int
max
Επιστρέφει το μέγιστο δύο αριθμών
min
Επιστρέφει τον ελάχιστο δύο αριθμών
rand
Επιστρέφει έναν ψευδοτυχαίο αριθμό 0 - RAND_MAX
srand
Καθορίζει τη βάση εκκίνησης της rand
malloc
Δεσμεύει και επιστρέφει δυναμική μνήμη
free
Ελευθερώνει δυναμική μνήμη
realloc
Αλλάζει το μέγεθος ενός τμήματος δυναμικής μνήμης
exit
Τερματίζει το πρόγραμμα
system
Εκτελεί εντολή του λειτουργικού συστήματος
getenv
Επιστρέφει την τιμή μιας μεταβλητής του λειτουργικού συστήματος
qsort
Ταξινομεί έναν πίνακα
bsearch
Δυαδική αναζήτηση σε ταξινομημένο πίνακα

Παράδειγμα

Το παρακάτω παράδειγμα γεμίζει έναν πίνακα με ψευδοτυχαίους αριθμούς, τον ταξινομεί και επιτρέπει στο χρήστη να ψάξει για έναν αριθμό μέσα στον πίνακα.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>


/*
 * Qsort/bsearch comparison function
 */
int
compare(const int *a, const int *b)
{
        return (*a - *b);
}

/*
 * Print an integer table contents using a given label
 */
void
dump_int_table(char *label, int *table, int nelem)
{
        int i;

        printf("%s\n", label);
        for (i = 0; i < nelem; i++)
                printf("(%d%d) ", i, table[i]);
        putchar('\n');
}

main()
{
        int *tbl;                       /* Integer table */
        char buff[10];                  /* User input */
        int n, i;                       /* User number, counter */
        int *pos;                       /* Found position */
        const int TABLE_SIZE = 64;

        /* Randomize the random number generator using current time */
        srand(time(NULL));

        /* Allocate table memory */
        tbl = (int *)malloc(TABLE_SIZE * sizeof(int));

        /* Fill table with random numbers (0 - 2 * TABLE_SIZE) */
        for (i = 0; i < TABLE_SIZE; i++)
                tbl[i] = rand() % (TABLE_SIZE * 2);
        dump_int_table("Table with random numbers", tbl, TABLE_SIZE);

        /* Sort the table contents */
        qsort(tbl, TABLE_SIZE, sizeof(int), compare);
        dump_int_table("Sorted table with random numbers", tbl, TABLE_SIZE);

        /* Read and convert a number from the user (without using scanf) */
        printf("Search for which number? (0-%d):"2 * TABLE_SIZE);
        fgets(buff, sizeof(buff), stdin);
        n = atoi(buff);

        /* Search for the number and report result */
        pos = bsearch(&n, tbl, TABLE_SIZE, sizeof(int), compare);
        if (pos)
                printf("The number %d is located at table position %d\n",
                        n, pos - tbl);
        else
                printf("The number %d is not in the table\n");

        /* Free memory and exit - not strictly needed */
        free(tbl);
        exit(0);
}

Συμβολοσειρές

Επικεφαλίδα

#include <string.h>

Περιλαμβάνει

Συναρτήσεις επεξεργασίας συμβολοσειρών (βλ. αναλυτικές σημειώσεις).

Διάγνωση

Επικεφαλίδα

#include <assert.h>

Περιλαμβάνει

Τη συνάρτηση assert

Βασικές συναρτήσεις

assert
Με τη δήλωση assert(x) ο προγραμματιστής δηλώνει στο πρόγραμμα ότι με βάση το σχεδιασμό του περιμένει ότι η χ θα είναι αληθής. Αν η x δεν είναι αληθής το πρόγραμμα διακόπτει την εκτέλεσή του με μήνυμα που πληροφορεί το χειριστή για το σημείο που παρουσιάστηκε το πρόβλημα.

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει τους αριθμούς 0-9. Στη συνέχεια θέλουμε να τυπώσει 20 με τη χρήση του i. Για το σκοπό αυτό ελέγχουμε ότι το i στο τέλος του βρόχου είναι όντως 10.
#include <stdio.h>
#include <assert.h>

main()
{
        int i;

        for (i = 0; i < 10; i++)
                printf("%d\n", i);
        /* i should be 10 here */
        assert(i == 10);
        printf("%d\n", i + i);
}

Ώρα και ημερομηνία

Επικεφαλίδα

#include <time.h>

Περιλαμβάνει

Συναρτήσεις για την επεξεργασία ημερομηνίας και ώρας

Βασικές συναρτήσεις

time
Επιστρέφει την ώρα (σε δευτερόλεπτα από το 1970)
localtime
Μετατρέπει την ώρα από δευτερόλεπτα σε τοπική ώρα και την αποθηκεύει στη δομή struct tm
asctime
Μετατρέπει την ώρα από τη δομή σε συμβολοσειρά.
difftime
Επιστρέφει τη διαφορά ανάμεσα σε δύο ώρες

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει την τοπική ώρα.
#include <stdio.h>
#include <time.h>

main()
{
        struct tm local;
        time_t now;

        time(&now);
        local = *localtime(&now);
        printf("%s\n", asctime(&local));
}

Όρια υλοποίησης

Επικεφαλίδα

#include <limits.h>
#include <float.h>

Περιλαμβάνει

Σταθερές που ορίζουν τα όρια των ακεραίων και αριθμών κινητής υποδιαστολής για τη συγκεκριμένη υλοποίηση.

Βασικές τιμές

CHAR_MAX
Ο μέγιστος char
CHAR_MIN
Ο ελάχιστος char
INT_MAX
Ο μέγιστος int
INT_MIN
Ο ελάχιστος int
DBL_MAX
Ο μέγιστος double
DBL_MIN
Ο ελάχιστος double
DBL_DIG
Τα δεκαδικά ψηφία ακρίβειας των double

Παράδειγμα

Το παρακάτω παράδειγμα τυπώνει τα όρια της υλοποίησης.
#include <stdio.h>
#include <limits.h>
#include <float.h>

main()
{
        printf("CHAR_MAX=%d\n"CHAR_MAX);
        printf("CHAR_MIN=%d\n"CHAR_MIN);
        printf("INT_MAX=%d\n"INT_MAX);
        printf("INT_MIN=%d\n"INT_MIN);
        printf("DBL_MAX=%g\n"DBL_MAX);
        printf("DBL_MIN=%g\n"DBL_MIN);
        printf("DBL_DIG=%d\n"DBL_DIG);
}
Στην υλοποίηση Visual C++ 5.00 τυπώνει:
CHAR_MAX=127
CHAR_MIN=-128
INT_MAX=2147483647
INT_MIN=-2147483648
DBL_MAX=1.79769e+308
DBL_MIN=2.22507e-308
DBL_DIG=15

Ασκήσεις

Πρότυπη βιβλιοθήκη

  1. Να βρείτε και να διαβάσετε την τεκμηρίωση για τη συνάρτηση rename. Γράψτε ένα πρόγραμμα που να τη χρησιμοποιεί.
Η άσκηση είναι προαιρετική.

Βιβλιογραφία