Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 19η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1
Τι θα ακούσετε σήμερα Βασικές διαφορές της C από τη C++. Απλά παραδείγματα προγραμμάτων C. Χειρισμός αρχείων κειμένου με C. 2
Μερικές διαφορές της C από την C++ Δεν υπάρχουν: τάξεις, σχεδιότυπα, υπερφόρτωση συναρτήσεων. Δεν υπάρχουν χώροι ονομάτων. Δεν υπάρχουν αναφορές. Δεν υπάρχουν οι new και delete. Αντί αυτών: malloc και free. Διαφορετικές συναρτήσεις εισόδου/εξόδου. printf, scanf, κλπ. Μερικές διαφορετικές βασικές βιβλιοθήκες. Π.χ. «stdio.h» αντί «iostream.h». 3
Μερικές διαφορές συνέχεια Δεν υπάρχει τύπος bool. Αντί αυτού int: 0 για false, άλλες τιμές για true. Δεν υπάρχει τύπος string. Αντί αυτού πίνακες από char. Χειρισμός, μεταβίβασή τους με δείκτες (char*). Το «string.h» δεν παρέχει τύπο string αλλά χρήσιμες συναρτήσεις για το χειρισμό πινάκων char. Σταθερές ορίζονται συνήθως με #define. Αν και τα νέα πρότυπα της C παρέχουν και const. Σχόλια μόνο με /*...*/, όχι με //. Αν και πολλοί μεταγλωττιστές πια υποστηρίζουν και //. Αρχεία πηγαίου κώδικα:.c αντί για.cpp. 4
Ένα πρώτο πρόγραμμα C #include <stdio.h> /* Αντίστοιχο του <iostream>. */ #define MAX_NAME_LENGTH 255 int main() { unsigned short int age = 0; char name[max_name_length]; /* Δεν υπάρχουν string. */ printf("enter your age: "); /* Τυπώνει στο standard output (stdout). */ scanf("%d", &age); /* Διαβάζει δεκαδικό αριθμό από το standard input if(age < 18) { (stdin) και τον αποθηκεύει στη μεταβλητή age. */ printf("you are too young (only %d) to use this program.\n", age); return 1; } printf("enter your name: "); scanf("%s", name); /* Διαβάζει συμβολοσειρά. Ο name είναι πίνακας (δείκτης).*/ printf("hi %s. Nice meeting a person of your age (%d).\n", name, age); return 0; } Μεταγλώττιση με: > gcc -o myprog.exe myprog.c 5
Παράδειγμα με stdin και stdout /* Τυπώνει στο stdout αριθμημένες τις γραμμές του stdin.*/ #include <stdio.h> #include <string.h> /* Παρέχει συναρτήσεις χειρισμού πινάκων χαρακτήρων (π.χ. strncpy). Διαφορετικό από το <string> της C++. */ #define MAX_PROG_NAME_LENGTH 80 #define MAX_LINE_LENGTH 1024 /* Καθολική (global) μεταβλητή. Έχουν πρόσβαση σε αυτήν όλα τα τμήματα του προγράμματος. Χρησιμοποιούμε καθολικές μεταβλητές με φειδώ (ή καθόλου). */ char programname[max_prog_name_length]; /* Συνεχίζεται... */ 6
Συνέχεια του παραδείγματος... int main(int argc, char* argv[]) { char line[max_line_length]; unsigned long counter = 0; /* Αντιγράφει στον καθολικό πίνακα programname το όνομα που έχει το πρόγραμμα στη γραμμή εντολών, περικόπτοντάς το αν δεν χωράει. */ strncpy(programname, argv[0], MAX_PROG_NAME_LENGTH 1); if(argc!= 1) { fprintf(stderr, "%s: bad number of arguments.\n", programname); return 1; } /* Διαβάζει στον πίνακα line μια ολόκληρη γραμμή από το stdin, μέχρι MAX_LINE_LENGTH 1 χαρακτήρες. */ while(fgets(line, MAX_LINE_LENGTH, stdin)!= NULL) { printf("%d: %s", ++counter, line); } return 0; } 7
Παραλλαγή με άνοιγμα/κλείσιμο αρχείων #include <stdio.h> #include <string.h> #define MAX_PROG_NAME_LENGTH 80 #define MAX_LINE_LENGTH 1024 char programname[max_program_name_length]; int main(int argc, char *argv[]) { FILE* inputfile; /* Δείκτες σε δομές FILE. Κάθε FILE */ FILE* outputfile; /* παριστάνει ένα αρχείο. */ char line[max_line_length]; unsigned long counter = 0; strncpy(programname, argv[0], MAX_PROG_NAME_LENGTH - 1); /* Συνεχίζεται... */ 8
Συνέχεια της παραλλαγής... if(argc!= 3) { fprintf(stderr, "%s: bad number of arguments.\n", programname); return 1; } /* Άνοιγμα αρχείου για διάβασμα. */ if((inputfile = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "%s: could not open input file.\n", programname); return 2; } /* Άνοιγμα αρχείου για γράψιμο. */ if((outputfile = fopen(argv[2], "w")) == NULL) { fprintf(stderr, "%s: could not open output file.\n", programname); return 3; } /* Συνεχίζεται... */ 9
Συνέχεια της παραλλαγής... while(fgets(line, MAX_LINE_LENGTH, inputfile)!= NULL) { fprintf(outputfile, "%d: %s", ++counter, line); } fclose(inputfile); fclose(outputfile); return 0; } 10
Παράδειγμα με πολλά πηγαία αρχεία /* Αρχείο main.c : */ #include "mystring.h" Μεταγλώττιση με: > gcc -o myprog.exe main.c mystring.c int main() { char* str1 = "string alpha"; char* str2 = "string beta"; printf("length of str1: %d, length of str2: %d\n", mystrlen(str1), mystrlen(str2)); } return 0; 11
Συνέχεια παραδείγματος πολλών πηγαίων αρχείων /* Αρχείο mystring.h : */ #ifndef _MYSTRING_H_ #define _MYSTRING_H_ unsigned long mystrlen(char* s); #endif 12
Συνέχεια παραδείγματος πολλών πηγαίων αρχείων /* Αρχείο mystring.c : */ #include "mystring.h" unsigned long mystrlen(char* str) { unsigned long counter = 0; while(*str!= '\0') { /* Οι πίνακες χαρακτήρων που παριστάνουν συμβολοσειρές τελειώνουν με '\0'. */ str++; /* Προχωράμε το δείκτη στην επόμενη θέση του πίνακα χαρακτήρων. */ counter++; } return counter; } 13