Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Σχετικά έγγραφα
Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Δομημένος Προγραμματισμός (ΤΛ1006)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ερωτήσεις Επανάληψης

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Προγραμματισμό για ΗΜΥ

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Η γλώσσα προγραμματισμού C

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραμματισμό

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Υπολογιστών με C++

Διδάσκων: Παναγιώτης Ανδρέου

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Διαδικασιακός Προγραμματισμός

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Η γλώσσα προγραμματισμού C

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Προγραμματισμός Η/Υ (ΤΛ2007 )

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Η γλώσσα προγραμματισμού C

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Δομημένος Προγραμματισμός (ΤΛ1006)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Η γλώσσα προγραμματισμού C

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Προγραμματισμός Ι (ΗΥ120)

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Η γλώσσα προγραμματισμού C

Διαδικασιακός Προγραμματισμός

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

1. ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ C

ΗΥ-150. Προγραμματισμός

Διαδικασία Ανάπτυξης Λογισμικού

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Προγραμματισμός I (Θ)

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ. Ενότητα 6: Πίνακες και Δείκτες

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

ΗΥ-150. Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Η γλώσσα προγραμματισμού C

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

Συμβολοσειρές Ορίσματα στη main()

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 11η: Δείκτες, μέρος 1

Προγραμματισμός Υπολογιστών με C++

Μεθόδων Επίλυσης Προβλημάτων

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Μεθόδων Επίλυσης Προβλημάτων

είκτες και Πίνακες (2)

Εισαγωγή στον Προγραμματισμό

Ενδεικτικές λύσεις και στατιστικά

Δεδομένα, Τύποι και Τιμές

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διάλεξη 6: Δείκτες και Πίνακες

Διάλεξη 5η: Εντολές Επανάληψης

Transcript:

Πίνακες: μια σύντομη εισαγωγή Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Πίνακες(Arrays): έννοιες και ορισμοί Ορισμός: Πίνακας (array) = σύνολο μεταβλητών του ιδίου τύπου (int, float, char,...) με ένα κοινό όνομα. Αυτές λέγονται στοιχεία του πίνακα Διακρίνονται βάσει ακέραιου αριθμοδείκτη (index) Για πίνακα με Ν στοιχεία: τιμή αριθμοδείκτη από ως Ν-1 Όνομα πίνακα: ακολουθεί κανόνες ονομάτων μεταβλητών Επιτρέπονται περισσότεροι αριθμοδείκτες. Κάθε ένας = μία διάσταση. Κάθε διάσταση δικό της εύρος αριθμοδείκτη. Μέγεθος πίνακα = συνολικός αριθμός στοιχείων. Συνοψίζοντας: ο πίνακας έχει όνομα, τύπο, αριθμό διαστάσεων, εύρος τιμών αριθμοδείκτη σε κάθε διάσταση και μέγεθος.

Πίνακες: τρόπος γραφής και δήλωσης Δήλωση ακέραιου (int) πίνακα με 1 στοιχεία: int a[1]; Απόδοση της τιμής 5 στο πρώτο, δεύτερο και δέκατο στοιχείο του a: a[9] = a[1] = a[9] = 5; Αρχικοποίηση και απόδοση τιμών, εν γένει. Στη δήλωση: int x[3] = {1, 3, 5}; char letters[ ] = {, 'b', 'c', 'd', 'e'}; /* δίνει αυτόματα μέγεθος 5 */ float abc[1] = {1.41, 2.72, 3.14} /* τα υπόλοιπα μηδέν! */ int VERY_BIG[1] = {}; /* τρόπος αυτόματου μηδενισμού */ Στο σώμα του προγράμματος int i, x[5]; for (i = ; i < 1; i++) x[i] = i; for (i = ;i < 25;i++) { x[2*i] = ; x[2*i+1] = 1; } x[5] = 5; κλπ κλπ

Πίνακες: φυσική σημασία (θέσεις μνήμης) Υλοποίηση: Πίνακας = διαδοχικές θέσεις μνήμης. int x[ ] = {2, 4, 6, 8} (4 bytes / στοιχείο) 2 4 6 8 x[] x[1] x[2] x[3]... char city[ ] = {'K', 'o', 'z',, 'n', 'i'} (1 byte / στοιχείο) 'K' 'o' 'z' 'n' 'i' x[] x[1] x[2]...

Πίνακες: φυσική σημασία (θέσεις μνήμης) Υλοποίηση: Πίνακας = διαδοχικές θέσεις μνήμης. Τελεστής sizeof: μνήμη που καταλαμβάνουν τα δεδομένα sizeof ( char ) 1 sizeof ( int ) 4 sizeof ( float ) 4 Επίσης, char letter; int n, x[ ] = {2, 4, 6, 8} (4 bytes / στοιχείο) sizeof ( letter ) 1 sizeof ( n ) 4 sizeof ( x [] ) 4 sizeof ( x ) 16 sizeof ( x ) / sizeof( x[]) 4 Άρα: αριθμός στοιχείων πίνακα Α = sizeof(a) / sizeof(a[])

Πίνακες και η σχέση τους με δείκτες Έστω: Τότε: float x[3]; x = συνώνυμο με & ( x[]) (διεύθυνση πρώτου στοιχείου) x[] x[1] x[2]... Κάθε κουτάκι = 1 byte. Διεύθυνση του πρώτου = x = σταθερά δείκτη (δεν παίρνει τιμή με τελεστή = ) Αριθμητική δεικτών = εναλλακτικός τρόπος αναφοράς. &x[], &x[1], &x[2],... ισοδυναμεί με x, x+1, x+2,... (συμβολισμός!!! όχι πρόσθεση) x[], x[1], x[2],... ισοδυναμεί με *x, *(x+1), *(x+2),...

Πίνακεςπολλών διαστάσεων Πίνακας με 5 γραμμές και 4 στήλες. int a[5][4]; Αρχικοποίηση: int b[2][3] = { { 1, 2, 3}, {3, 2, 5} }; επίσης: int b[2][3] = {1, 2, 3, 3, 2, 5}; /* ο compiler βρίσκει πού μπαίνουν! */ Η πρώτη διάσταση μπορεί να μείνει απροσδιόριστη: int b[ ][3] = { { 1, 2, 3}, {3, 2, 5} }; Χειρισμός: for ( i = ; i < m; i++) for( j = ; j < n; j++) pinakas[i][j] =... /* κάποια παράσταση των i και j */

Αλφαριθμητικά (strings) τι γνωρίζουμε ήδη... Συναρτήσεις εισόδου εξόδου printf("hello Kozani city!\n"); Αλφαριθμητική σταθερά Ακολουθία διαφυγής (αλλαγή γραμμής) int number = 2; printf("initial number = %d\n", number); Αλφαριθμητικό μορφοποίησης Προδιαγραφή μορφοποίησης

Αλφαριθμητικά (strings) τι γνωρίζουμε ήδη... Δεδομένα τύπου char char c = ; /* έχει την τιμή 97 (ascii) */ μεταβλητή τύπου char σταθερά τύπου char unsigned char... 255 signed char -128... 127 sizeof(char) = 1 byte Χαρακτήρας = byte Bytes = χαρακτήρες Όλα τα δεδομένα = χαρακτήρες Επεξεργασία δεδομένων = επεξεργασία ρευμάτων bytes/χαρακτήρων

Αλφαριθμητικά (strings) τι γνωρίζουμε ήδη... Πίνακες = ομάδες μεταβλητών του ίδιου τύπου αναφερόμενες μέσω ενός ακέραιου αριθμοδείκτη int x[ ] = {2, 4, 6, 8} 2 4 6 8 char city[ ] = {'K', 'o', 'z',, 'n', 'i'} x x+1 x+2 x+3 'K' 'o' 'z' 'n' 'i' 'K' = x[] = *x 'o' = x[1] = *(x+1) κλπ

Αλφαριθμητικά: έννοιες και ορισμοί char city[ ] = {'K', 'o', 'z',, 'n', 'i'} 'K' 'o' 'z' 'n' 'i' άλλα δεδομένα τίποτε δε μας λέει πού σταματάμε... μηδενικός (null) χαρακτήρας Παραλλαγή: char city[ ] = {'K', 'o', 'z',, 'n', 'i', '\'} 'K' 'o' 'z' 'n' 'i' '\' άλλα δεδομένα εδώ τελειώνουμε Αλφαριθμητικό = πίνακας char με '\' στο τέλος Αλλάζουν συχνά μέγεθος πιο εύκολο να σημειώνεται ο τερματισμός τους από το να επανακαθορίζεται το μέγεθος

Αλφαριθμητικά: ορισμός και στοιχειώδεις χειρισμοί Αλφαριθμητικές Σταθερές: ο,τι περικλείεται σε " " Αλφαριθμητικές Μεταβλητές: Δήλωση: Ως πίνακας Ως δείκτης char city[7]; char *city; Αρχικοποίηση - κατά τη δήλωση char city[11] = {'K', 'o', 'z',, 'n', 'i', '\'}; (δε βολεύει) char city[7] = "Kozani"; char city[ ] = "Kozani"; char *city = "Kozani"; (αυτά μάλλον είναι καλύτερα...) ο τερματικός χαρακτήρας \ μπαίνει αυτόματα, - με συναρτήσεις βιβλιοθήκης Αργότερα...

Αλφαριθμητικά: στοιχειώδεις χειρισμοί Το κενό αλφαριθμητικό. Έστω char *city; *city = '\'; /* ή ισοδύναμα: city[] = '\' */ Ισοδυναμεί με: '\' Έστω char *city = "Kozani"; από εδώ και πέρα οτιδήποτε άλλα περιεχόμενα printf("%s", city); δεν τυπώνει τίποτα. 'K' 'o' 'z' *city = '\'; /* ή ισοδύναμα: city[] = '\' */ Ισοδυναμεί με: 'n' 'i' '\' άλλα δεδομένα '\' 'o' 'z' 'n' 'i' '\' άλλα δεδομένα Και πάλι είναι το κενό αλφαριθμητικό! Κενός χαρακτήρας = τερματισμός, Οτιδήποτε μετά τον κενό χαρακτήρα αγνοείται

Ένα απλό πρόγραμμα:... char *p; char lala* = example ; printf("%s\n"); lala[] = 'E'; / printf("%s\n"); for(p = lala; p!= '\'; p++) *p = '1'; printf("%s"); Παραδείγματα Πώς αλλιώς μπορεί να γραφτεί; Τι θα τυπώσει; Τώρα τι θα εμφανίσει; Και τώρα; printf("the size of lala is %d\n", sizeof(lala)/sizeof (char)); Τι θα τυπώσει τώρα και γιατί;

Πίνακες Αλφαριθμητικών Πίνακες δύο διαστάσεων, π.χ. int x[2][3] = {}; x[] και x[1] παριστάνουν μονοδιάστατους πίνακες μήκους 3. Σα να έλεγα: int x[][3] = {}; int x[1][3] = {}; Ερώτηση: γίνονται πίνακες με διαφορετικό μήκος κάθε γραμμής; Σα να έλεγα: int x[][2] = {}; int x[1][4] = {}; κλπ; Απάντηση: ναι, αν κάθε στοιχείο της στήλης είναι δείκτης. int *x[2] = {NULL}; σημαίνει: x[] x[1] NULL NULL μετά την πρώτη θέση χωράει οτιδήποτε μετά την πρώτη θέση χωράει οτιδήποτε

Πίνακες Αλφαριθμητικών Ερώτηση: πώς δίνουμε συγκεκριμένο μήκος σε κάθε περιοχή όπου δείχνουν τα στοιχεία του πίνακα δεικτών Απάντηση: γενικά, με συναρτήσεις δυναμικής διαχείρισης μνήμης Ειδικά για αλφαριθμητικά, ακόμη πιο εύκολο: με " ". Παραδείγματα: char *cities[ ] = {"Kozani", "Ioannina", "Athina", "Thessaloniki"}; 'K' 'o' 'z' 'I' 'o' 'A' 't' 'h' 'T' 'h' 'e' 'n' 'i' 's' 'n' 'n' 'n' 's' 'i' 'i' '\' 'n' '\' 'l' 'o' '\' 'n' 'i' 'k' 'i' '\'

Πίνακες Αλφαριθμητικών Συνήθης εφαρμογή πίνακα αλφαριθμητικών: ορίσματα γραμμής εντολών Ορισμός συνάρτησης main: int main(int argc, char *argv[ ]) ή int main(int argc, char **argv) /* το ίδιο κάνει! */ int main ( int argc, char *argv[ ] ) Πόσα ορίσματα; Ποια ορίσματα; argv[] = πάντα όνομα εκτελέσιμου προγράμματος argv[1], argv[2],... = ορίσματα γραμμής εντολών εφόσον υπάρχουν. Αν δεν υπάρχουν, αντίστοιχος δείκτης = NULL argc = αριθμός αυτών >= 1 (τουλάχιστον το argv[])

Παράδειγμα γραμμής εντολών. Πίνακες Αλφαριθμητικών Έστω πρόγραμμα με όνομα εκτελέσιμου αρχείου cities. Εκτελούμε δίνοντας τα παρακάτω ορίσματα: %cities Kozani Ioannina Lamia Thessaloniki (πατάμε Enter) Τότε: argc ---> 4 argv[] ---> cities argv[1] ---> Kozani argv[2] ---> Ioannina argv[3] ---> Lamia argv[4] ---> Thessaloniki

Παράδειγμα γραμμής εντολών. Πίνακες Αλφαριθμητικών Με τι μπορεί να έμοιαζε η υλοποίηση του προηγούμενου: #include <stdio.h> int main (int argc, char **argv) { int i; if(argc == ) /* αν δε δοθούν ορίσματα τότε καλείται... */ help( ); /*...κάποια συνάρτηση που τυπώνει μήνυμα βοήθειας */ else for(i = ; i < argc; i++) /* αν δοθούν ορίσματα τότε καλείται... */ process(argv[i]); /*...κάποια συνάρτηση επεξεργασίας αυτών */ return ; }