Τμήμα:C/Μάθημα 6ο

Από Βικιεπιστήμιο
Προηγούμενη
Ενότητα
Περιεχόμενα Επόμενη
Ενότητα


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

Μονοδιάστατοι πίνακες[επεξεργασία]

Οι μονοδιάστατοι πίνακες είναι οι πιο απλοί πίνακες και αποτελούνται από μια μόνο γραμμή.

Σύνταξη
datatype arrayIdentifier[size];
Όπου datatype ένας οποιοσδήποτε τύπος δεδομένων (int,float,char, κτλ.).

Όπου 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, αλλά μπορούμε και μόνοι μας
Μην ξεχνάμε πως το index αρχίζει από το 0. Άρα το name[0] είναι το 'Α', και τελειώνει στο name[6] με το 's'.


Η παρακάτω μεταβλητή είναι ένας πίνακας χαρακτήρων.
	char chars[7] = {'A','n','d','r','e','a','s'};


Επιπλέον πρέπει να έχουμε υπόψη μας κάποιες αλλαγές στην είσοδο και έξοδο δεδομένων με τις συμβολοσειρές.

  • Για την εκτύπωση συμβολοσειρών, μάθαμε από το Μάθημα 2, πως για την απεικόνιση μιας συμβολοσειράς στην οθόνη χρειαζόμαστε τον συμβολισμό %s.
  • Η εντολή scanf(), αναγνωρίζει μόνο λέξεις και χαρακτήρες. Όταν συναντήσει κενό σταματάει την ανάγνωση. Για την ανάγνωση συμβολοσειρών από το πληκτρολόγιο υπάρχει η εντολή fgets(), που αναλύεται παρακάτω.
Σύνταξη
fgets(text,sizeof(text),stdin);
Όπου text, η μεταβλητή που θα αποθηκευτεί η συμβολοσειρά μας. sizeof(text), το μέγεθος της μεταβλητής. stdin, σημαίνει standard input και είναι το πληκτρολόγιο. Η τρίτη παράμετρος λέει στην fgets() από που θα προέλθει η συμβολοσειρά.


Παράδειγμα[επεξεργασία]

Ο παρακάτω κώδικας δέχεται μια μεταβλητή με όνομα text μέγιστου μήκους 500 χαρακτήρων, και μετατρέπει τους αγγλικούς μικρούς χαρακτήρες σε κεφαλαίους. Αφού τελειώσει ξαναεκτυπώνει την συμβολοσειρά.
#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); // Έξοδος δεδομένων
}
Αυτός ο κώδικας είναι ακριβός ο τρόπος με τον οποίον δουλεύουν τα αντίστοιχα προγραμματα Micosoft Office Word, Open Office Writer κ.α. για να μετατρέψουν το κείμενο σε κεφαλαία.[1]


Παράδειγμα κρυπτογράφησης[επεξεργασία]

Το παρακάτω πρόγραμμα διαβάζει ένα κείμενο από το πληκτρολόγιο, το πολύ 500 χαρακτήρες, και το κρυπτογραφεί με αλγόριθμο +2. Αφού εκτυπώσει το κρυπτογραφημένο κείμενο, το αποκρυπτογραφεί και το ξαναεκτυπώνει.
#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);
}
Μην ξεχνάτε, εάν το παράθυρο κλείνει χωρίς να προλάβετε να δείτε τι σας γράφει προσθέστε μια εντολή getch(), στο τέλος.


Σημειώσεις[επεξεργασία]

  1. Για να κάνουμε την μετατροπή εκμεταλλευόμαστε τον πίνακα ASCII.
Προηγούμενη
Ενότητα
Περιεχόμενα Επόμενη
Ενότητα