Τμήμα: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]-=32 : 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);
}
Σημειώσεις
[επεξεργασία]Προηγούμενη Ενότητα |
Περιεχόμενα | Επόμενη Ενότητα |