C/Μάθημα 6ο
Από Βικιεπιστήμιο
| Προηγούμενη Ενότητα |
Περιεχόμενα | Επόμενη Ενότητα |
Σε όλες τις γλώσσες προγραμματισμού υπάρχει η δυνατότητα ομαδοποίησης των δεδομένων ίδιου τύπου. Συμβατικά ονομάζουμε την δομή που προκύπτει πίνακα, θεωρώντας πως τα δεδομένα αποθηκεύονται σε γραμμές και στήλες αν και στην μνήμη η αποθήκευση γίνεται σειριακά. Αναφορά στον πίνακα γίνεται μέσω ενός ονόματος, όπως στις μεταβλητές, ενώ για τα δεδομένα ενός πίνακα χρησιμοποιείται το όνομα και ένας αριθμός που καθορίζει την θέση του στοιχείου μέσα στον πίνακα. Στην C, η αρίθμηση των πινάκων ξεκινά πάντα από το μηδέν.
Πίνακας περιεχομένων |
[επεξεργασία] Μονοδιάστατοι πίνακες
Οι μονοδιάστατοι πίνακες είναι οι πιο απλοί πίνακες και αποτελούνται από μια μόνο γραμμή.
datatype arrayIdentifier[size];
Όπου arrayIdentifier ένα οποιοδήοτε όνομα για την ονομασία του πίνακα που να υπόκειται στους κανόνες των identifiers.
Και τέλος το size είναι το μέγεθος του πίνακα αρχίζοντας από το 0 και φτάνοντας μέχρι το size-1./* Δήλωση */ int numbers[10]; float temp[30]; char name[15]; // Αυτό είναι μια σειρά χαρακτήρων, δηλαδή ένα string. /* Δήλωση και Αρχικοποίηση */ int numbers[10] = { 8,0,69,167,349,-428,29 } // αρχικοποίηση των θέσεων 0-6, οι θέσεις 7-9 μένουν κενές int temp[] = { 8,0,69,167,349,-428,29 } // δημιουργία πίνακα ακριβώς 7 θέσεων // Εκχώρηση τιμών numbers[0] = 8; numbers[1] = 69; // κτλ.
[επεξεργασία] Πολυδιάστατοι πίνακες
Στην C, θεωρητικά δεν υπάρχει όριο στις διαστάσεις ενός πίνακα, αν και σε ορισμένους μεταγλωττιστές το όριο είναι 256 διαστάσεις. Δημιουργούνται τόσες διαστάσεις όσοι είναι και οι αριθμοί που ακολουθούν στα brackets. Πίνακες μεγαλύτεροι των 2 διαστάσεων δεν μπορούν να εκτυπωθούν σε δύο διαστάσεις.
datatype arrayIdentifier[size1][size2][size3]...[sizeΝ];
int numbers[10][10]; // πίνακας 10x10, δηλαδή 100 θέσεων float temp[2][7][5]; // τρισδιάστατος πίνακας 2x7x5, δηλαδή 70 θέσεων
[επεξεργασία] Εφαρμογή
#include <stdio.h> int main() { int current_day=0; // Η μεταβλητή θα κρατάει την μέρα, μέχρι το τέλος της εβδομάδας. int temp_per_day[7]; // Οι θερμοκρασίες ανά μέρα. int sum,max,min; // Η sum είναι το άθροισμα των τιμών. float average; while (current_day<7) // Είσοδος δεδομένων για την κάθε μέρα { printf("Day %d. What is the temperature today? ",current_day+1); scanf("%d",&temp_per_day[current_day++]); } sum = 0; max = temp_per_day[0] = min = temp_per_day[0]; // Αν δεν αρχικοποιήσουμε την max, αυτή έχει μια τυχαία τιμή for(int i=0 ; i<7 ; i++) { sum += temp_per_day[i]; if (max < temp_per_day[i]) // Ελέγχος για την max max = temp_per_day[i]; else if (min > temp_per_day[i]) // Έλεγχος για την min min = temp_per_day[i]); } average = sum / 7.0; // ".0" ώστε να γίνει τέλεια διαίρεση, χωρίς υπόλοιπο printf("The highest temperature was %d, the lowest %d, and the average was %f\n",max,min,average); }
[επεξεργασία] Συμβολοσειρές
Στον προγραμματισμό οι λέξεις και προτάσεις είναι πίνακες χαρακτήρων. Αρκετές γλώσσες προγραμματισμού έχουν τον τύπο μεταβλητής string που δημιουργεί έναν πίνακα χαρακτήρων για την συμβολοσειρά που θα του δώσουμε. Στην C όμως πρέπει να ορίσουμε εμείς οι ίδιοι το μέγεθος του πίνακα. Η συμβολοσειρά συμβολίζεται με διπλά εισαγωγικά.
Στις συμβολοσειρές μετά το κελί του τελευταίου χαρακτήρα, προστίθεται άλλο ένα κελί με τον χαρακτήρα null \0. Αυτό ξεχωρίζει τον πίνακα συμβολοσειράς από τους πίνακες χαρακτήρων, αριθμών, κτλ.
char name[8] = "Andreas"; // Η C προσθέτει μόνη της τον χαρακτήρα null, αλλά μπορούμε και μόνοι μας
Επιπλέον πρέπει να έχουμε υπόψη μας κάποιες αλλαγές στην είσοδο και έξοδο δεδομένων με τις συμβολοσειρές.
- Για την εκτύπωση συμβολοσειρών, μάθαμε από το Μάθημα 2, πως για την απεικόνιση μιας συμβολοσειράς στην οθόνη χρειαζόμαστε τον συμβολισμό %s.
- Η εντολή scanf(), αναγνωρίζει μόνο λέξεις και χαρακτήρες. Όταν συναντήσει κενό σταματάει την ανάγνωση. Για την ανάγνωση συμβολοσειρών από το πληκτρολόγιο υπάρχει η εντολή fgets(), που αναλύεται παρακάτω.
fgets(text,sizeof(text,stdin);
[επεξεργασία] Παράδειγμα
#include <stdio.h> int main() { char text[500]; int i; printf("Type your text\n"); fgets(text,sizeof(text),stdin); // Είσοδος δεδομένων for (i=0 ; text[i]!='\0' ; i++){ // Έλεγχος κάθε χαρακτήρα ξεχωριστά (text[i]>'a' && text[i]<'z') ? text[i]-=37 : text[i]=text[i]; } printf("Your text in capitals:\n%s", text); // Έξοδος δεδομένων }
[επεξεργασία] Παράδειγμα κρυπτογράφησης
#include <stdio.h> int main() { char text[501]; int i; printf("Type your text:\n"); fgets(text, sizeof(text), stdin); for (i=0; text[i]!='\0'; i++){ text[i] += 2; } printf("The encrypted text is:\n%s",text); for (i=0 ; text[i]!='\0' ; i++){ text[i] -= 2; } printf("Decrypted text is:\n%s",text); }
[επεξεργασία] Σημειώσεις
- ↑ Για να κάνουμε την μετατροπή εκμεταλλευόμαστε τον πίνακα ASCII. Οι κεφαλαίοι χαρακτήρες είναι από το 65 έως το 90, ενώ οι μικροί από το 97 έως το 122. Τα γράμματα έχουν αντιστοιχία με 37 αριθμούς διαφορά. Καλό είναι να γνωρίζουμε μερικούς κωδικούς του ASCII, όπως το 27 που είναι το κουμπί ESCAPE (τώρα μπορείτε να φτιάξετε πρόγραμμα που να σταματάει την λειτουργία του όταν ο χρήστης πατάει το Esc).
- ↑ Για να κλείσετε την γραμμή εντολων, μπορείτε να χρησιμοποιήσετε την εντολή exit(). Μέσα στην παρένθεση μπορείτε να βάλετε έναν αριθμό ως αριθμό εξόδου όπως και στην return. Έτσι ανάλογα με την έξοδο, δείχνουμε στον χρήστη αν η εντολή εκτελέστηκε σωστά, ή που είναι το σφάλμα.
| Προηγούμενη Ενότητα |
Περιεχόμενα | Επόμενη Ενότητα |