Αρχές Προγραμματισμού

Σχετικά έγγραφα
ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

Αρχές Προγραμματισμού

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομημένος Προγραμματισμός

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

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

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

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

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

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

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

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

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

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

Διάλεξη 9η: Πίνακες (arrays)

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

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

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

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

Διάλεξη 8η: Αλφαριθμητικά (strings)

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

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

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

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

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

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

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

Διάλεξη 7: Συμβολοσειρές, Δείκτες και Παραδείγματα

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Επεξεργασία Αρχείων Κειµένου

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

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

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

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

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

C: Από τη Θεωρία στην Εφαρμογή

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Β' Περιόδου Θέµα 1. (α')

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

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

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

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

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

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

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

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

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

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

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Επεξεργασία κειμένου και συμβολοσειρών σε C

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

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

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

Συµβολοσειρές - Strings

Ενδεικτική περιγραφή μαθήματος

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης (Κεφάλαιο , KNK-2ED)

ΗΥ-150. Προγραµµατισµός. Πίνακες (Arrays)

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

Transcript:

Αρχές Προγραμματισμού https://eclass.upatras.gr/courses/ee806/index.php Βασίλης Παλιουράς paliuras@ece.upatras.gr Project σε Dev-C++ 2 1

Δείκτες (Pointers) Δείκτης: μεταβλητή στην οποία αποθηκεύουμε διεύθυνση θέσης μνήμης. δείχνει που είναι αποθηκευμένα δεδομένα Δήλωση Δείκτη <τύπος> *<όνομα δείκτη>; ΠΡΟΣΟΧΗ: Το όνομα πίνακα είναι διεύθυνση, αλλά δεν είναι μεταβλητή!!! 3 Παράδειγμα δήλωσης δείκτη char *ch_ptr; H μεταβλητή ch_ptr περιέχει διεύθυνση μνήμης στην οποία είναι αποθηκευμένο δεδομένο τύπου χαρακτήρα. char ch; Η μεταβλητή ch έχει ως αξία χαρακτήρα. Μπορούμε να δηλώσουμε δείκτες σε δεδομένα διαφόρων τύπων Βασικών τύπων Κατασκευασμένων τύπων 4 2

Παράδειγμα χρήσης δείκτη void main ( ) { char ch = 'a', ch2; char *ch_ptr ; Δήλωση δείκτη σε χαρακτήρα ch_ptr = &ch ; ch2 = *ch_ptr ; printf ("%c", ch2); * Περιεχόμενα της θέσης στην οποία δείχνει ο δείκτης 5 Πίνακες και δείκτες int arr[10], n ; *(arr + n) arr[n] arr + n &arr[n] αλλά και n[arr] *(n+arr) // (!!!) χρησιμοποιούμε δείκτες για να περάσουμε ως όρισμα σε συνάρτηση πίνακες ακριβέστερα: σε ποια διεύθυνση μνήμης βρίσκεται το πρώτο στοιχείο του πίνακα. 6 3

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char ch, ch2; char *ch_ptr ; ch = 'a'; printf( "ch is stored at %X\n", &ch); printf( "The value of ch is %c\n", ch); //ch_ptr is set to point to ch ch_ptr = &ch ; printf( "ch_ptr is stored at %X\n", &ch_ptr); printf( "The value of ch_ptr is set to %X\n", ch_ptr); //contents of ch_ptr (i.e., value of ch) //are copied to ch2 ch2 = *ch_ptr ; printf ("ch2 is stored at %X\n", &ch2); printf ("value of ch2: %c\n", ch2); system("pause"); return 0; 7 Χάρτης μνήμης Διεύθυνση 28FF18 28FF19 Περιεχόμενα μνήμης σε hex 1E FF 28FF1A 28 28FF1B 00 28FF1C 28FF1E 61 ch 28FF1F 61 ch2 Όνομα μεταβλητής ch_ptr 8 4

H συνάρτηση getchar() Διαβάζει έναν χαρακτήρα από την είσοδο. 9 Μερικές συναρτήσεις βασικής βιβλιοθήκης για αλφαριθμητικά πρότυπα στο <string.h> char *strcpy (char *, const char *) ; int strcmp (const char *, const char *) ; char *strcat (char *, const char *) ; char *strchr (const char *, char) ; size_t strlen (const char *) ; 10 5

Συναρτήσεις για προκαθορισμένο πλήθος χαρακτήρων. Παραδείγματα #include <string.h> int strncmp(const char *s1, const char *s2, size_t n); char *strncpy(char *s1, const char *s2, size_t n); 11 Παράδειγμα Διάβασε ένα αλφαριθμητικό Μέτρησε πόσες φορές περιλαμβάνει τον χαρακτήρα a Tύπωσε το αποτέλεσμα. void readstring(char *) ; int counta(char *); void printresult( int ) ; 12 6

#define N 50 H main ( ) του παραδείγματος #include <stdio.h> main ( ) { char astring[n]; int acount ; readstring (astring) ; acount = counta(astring); void readstring(char *) ; int counta(char *); void printresult( int ) ; void readstring(char *s ) { printf ("alpharithmitiko? "); scanf("%s", s); printresult(acount) ; void printresult ( int a) { printf("the result is %d\n", a); 13 Υλοποίηση της int counta(char *); int counta(char *s) { int count = 0 ; int i = 0; while ( s[i]!= 0 ) { if (s[i] == 'a') count ++; i ++ ; return count ; γιατί το μηδέν δηλώνει τέλος του αλφαριθμητικού αν ο τρέχων χαρακτήρας είναι ίσος με a, αύξησε το μετρητή count κατά ένα προχώρησε στον επόμενο χαρακτήρα του αλφαριθμητικού 14 7

Πρόθεμα και Επίθεμα (prefix και postfix) i++; /*postfix */ ++ i; /* prefix */ i = 0; myprint(i++); i = 0; myprint(++i); H myprint ( ) καλείται με διαφορετικό όρισμα (διαφορετική τιμή) στις δύο περιπτώσεις! 15 Πρόβλημα Πώς θα γράφαμε πρότυπο και τον ορισμό συνάρτησης η οποία θα δέχεται ως ορίσματα: α) το αλφαριθμητικό και β) τον χαρακτήρα για τον οποίο γίνεται ο έλεγχος. Πρότυπο αυτής: int countchar(char *, char); Παράδειγμα κλήσης acount = countchar(astring, 'a'); Τι πλεονεκτήματα έχει να γράφουμε γενικότερο κώδικα; 16 8

Χρήση της countchar(char *, char) main ( ) { char astring[n]; int acount ; readstring (astring) ; acount = countchar(astring, a ); printresult(acount) ; main ( ) readstring ( ) astring countchar ( ) acount printresult a 17 Πιθανές υλοποιήσεις int counta(char *s, char ch) { int count = 0 ; int i = 0; while ( s[i]!= 0 ) { if (s[i] == ch) count ++; i ++ ; return count ; int counta(char *s, char ch) { int count = 0 ; int i ; for (i=0; s[i]!= 0; i++) if (s[i] == ch) count ++; return count ; 18 9

int countchar(char *, char ); int countchar(char *s, char c) { int count = 0 ; int i = 0; while ( s[i] ) { count += (s[i] == c); i ++ ; return count ; int countchar(char *s, char c) { int count = 0 ; int i = 0; postfix notation while ( s[i] ) count += (s[i++] == c); return count ; 19 int countchar(char *, char ); int countchar(char *s, char c) { int count = 0 ; int i = 0; while ( s[i] ) { count += (s[i] == c); i ++ ; return count ; int countchar(char *s, char c) { int count = 0 ; int i ; for( i = 0; s[i]; count += (s[i++] == c)); int countchar(char *s, char c) { int count = 0 ; int i = 0; postfix notation while ( s[i] ) count += (s[i++] == c); return count ; int countchar(char *s, char c) { int count = 0 ; int i = 0; for( ; s[i]; count += (s[i++] == c)); return count ; return count ; 20 10

Πίνακας αλφαριθμητικών #define N 3 #include <stdio.h> main ( ) { int i ; char text[n][11] ={"dokimi", "test", "paradeigma"; Ο πίνακας 2-D λειτουργεί ως πίνακας 1-D με στοιχεία πίνακες 1-D. printf("text requires %d bytes\n", sizeof text ) ; for (i=0 ; i < N ; printf ("%s ", text[i++])); text[0] text[1] text[2] d o k i m i 0 t e s t 0 p a r a d e i g m a 0 21 #include <stdio.h> #define CHARSPERWORD 10 void displaywords (char [][CHARSPERWORD], int); void displaywordsptr (char *, int, int); void displaywordsstr(char *, int, int ) ; int main(int argc, char *argv[]) { char words[10][charsperword] ={"hello", "there"; char morewords[20][charsperword] = {"a", "few", "more", "words"; displaywords(words, 2); printf("\n"); displaywords(morewords, 4); printf("\n"); displaywordsptr((char *) morewords, 4, CHARSPERWORD); printf("\n"); displaywordsstr((char *) morewords, 4, CHARSPERWORD); return 0; void displaywords(char a[][charsperword], int rows) { int i, j; for (i=0; i< rows ; i++) for (j=0; j< CHARSPERWORD; j++) printf("%c", a[i][j]); void displaywordsptr(char *a, int rows, int columns) { int i, j; for (i=0; i<rows; i++) for (j =0 ; j<columns; j++ ) printf("%c", *(a+columns*i+j)); void displaywordsstr(char *a, int rows, int columns) { int i; for (i=0; i<rows; i++) printf("%s ", a + columns * i); 11

#define N 3 #include <stdio.h> Πίνακας 1-D με στοιχεία δείκτες σε χαρακτήρα main ( ) { int i ; char text1[n][11] ={"dokimi", "test", "paradeigma"; char *text2[n] = {"dokimi", "test", "paradeigma"; printf("text1 requires %d bytes\n", sizeof text1 ) ; printf("text2 requires %d bytes\n", sizeof text2 ); for (i=0 ; i < N ; printf ("%s ", text2[i++])) ; Προσοχή: Δεν περιλαμβάνει τις αλφαριθμητικές σταθερές! 23 Οργάνωση μνήμης και πίνακες δεικτών σε χαρακτήρες char *text2[3]; Οι αλφαριθμητικές σταθερές της αρχικοποίησης αποθηκεύονται σε άλλη περιοχή μνήμης. text2[0] text2[1] text2[2] 4 bytes 4 bytes 4 bytes dokimi\0 test\0 paradeigma\0 text2: περιλαμβάνει τρεις διευθύνσεις, όχι τα ίδια τα αλφαριθμητικά. 24 12

Δήλωση και αρχικοποίηση main ( ) { char name[10] = "katerina"; printf ("%s", name); scanf("%s", name); printf ("%s", name); 25 Δήλωση και ανάθεση τιμής σε αλφαριθμητικό char *strcpy(const char *, const char*); main ( ) { char name[10]; Λάθος (στη C) name = "katerina"; printf ("%s", name); #include <string.h> main ( ) { char name[10]; Σωστός τρόπος: strcpy(name,"katerina"); printf ("%s", name); scanf("%s", name); printf ("%s", name); scanf("%s", name); printf ("%s", name); 26 13

Τι γίνεται με δείκτες; #include <stdio.h> #include <string.h> main ( ) { char *name = "katerina"; printf ("%s", name); #include <stdio.h> #include <string.h> main ( ) { char *name ; name = "katerina"; printf ("%s", name); #include <stdio.h> #include <string.h> main ( ) { char *name ; name = "katerina"; printf ("%s", name); *name = 'K'; printf ("%s", name); σφάλμα χρόνου εκτέλεσης (run-time error): segmentation fault Λύση: χρήση διαθέσιμης περιοχής μνήμης (πχ με calloc () ) 27 Διεύθυνση ονόματος πίνακα char word[5]; word είναι η διεύθυνση του πρώτου στοιχείου &word[0] => char * &word έχει αριθμητικά την ίδια τιμή με το word Είναι όμως τύπου => char (*)[5] 28 14

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int array[5] = { 0, 1, 2, 3, 4 ; printf("have the same value...\n"); printf("array : %X\n", array); printf("&array: %X\n", &array); array, &array Έχουν ίδια τιμή, Αλλά διαφορετικό τύπο int * int (*) [5] printf("...but not the same type:\n"); printf("next element (array+1): %X\n", array + 1); printf("next element (&array+1): %X\n", &array + 1 ); Ίδια τιμή Μια θέση ακεραίου μετά return 0; 20 θέσεις ακεραίου μετά Δηλ. (1 πίνακας array) 29 char manywords[3][5]; Ένας πίνακας 3 στοιχείων, καθένα από τα οποία είναι πίνακας 5 στοιχείων, καθένα από τα οποία είναι char. #include <stdio.h> int main(int argc, char *argv[]) { int i; char manywords[3][5]; Πίνακας δύο διαστάσεων printf("array starts at memory address %X\n", manywords); for (i = 0; i < 3; i++) printf("line %d starts at memory address %X\n", i, manywords[i]); return 0; Διεύθυνση αρχής της i-οστής γραμμής 30 15

Πίνακες πολλών διαστάσεων ως παράμετροι σε συναρτήσεις char a[3][2]; char b[2][3]; [0][0] [0][1] [1][0] [1][1] [2][0] [2][1] [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] Οι συναρτήσεις χειρίζονται τους πίνακες κατ αναφορά Η θέση ενός στοιχείου στη μνήμη εξαρτάται από τη γεωμετρία του πίνακα Το a[1][0] είναι το 3 ο στοιχείο, το b[1][0] είναι το 4 ο στοιχείο Μια συνάρτηση πρέπει να ξέρει τη γεωμετρία ενός πίνακα παραμέτρου Μπορούμε να παραλείψουμε μόνο την πρώτη διάσταση (το πλήθος γραμμών) σε μια δήλωση Σε πίνακες Ν διαστάσεων, μπορούμε να παραλείψουμε μόνο μία διάσταση και να δηλώσουμε μήκη για τις υπόλοιπες Ν 1 Ευέλικτος κώδικας χρησιμοποιώντας ως παράμετρο δείκτη στο πρώτο στοιχείο του πίνακα 31 char manywords[3][5]; [0][0] [0][1] [0][2] [0][3] [0][4] [1][0] [1][1] [1][2] [1][3] [1][4] [2][0] [2][1] [2][2] [2][3] [2][4] Το μέγεθος σε bytes ανά στοιχείο καθορίζεται από τον τύπο του στοιχείου Εδώ char, άρα 1 byte ανά στοιχείο. Αποθήκευση στη μνήμη [0][0] 0x22FE40 [0][1] [0][2] [0][3] [0][4] [1][0] 0x22FE45 [1][1] [1][2] [1][3] [1][4] [2][0] 0x22FE4A [2][1] [2][2] [2][3] [2][4] manywords[0] manywords[1] manywords[2] 32 16

COLS Τρία στοιχεία COLS Δύο γραμμές COLS #define ROWS 3 #define COLS 5 char manywords[rows][cols]; [0][0] [0][1] [0][2] [0][3] [0][4] [0][0] [0][1] [0][2] [0][3] [0][4] [1][0] [1][1] [1][2] [1][3] [1][4] [2][0] [2][1] [2][2] [2][3] [2][4] [1][0] Κάθε γραμμή έχει COLS στοιχεία [1][1] [1][2] [1][3] [1][4] To στοιχείο manywords[2][3] βρίσκεται δύο γραμμές (άρα 2 * 5 στοιχεία) συν τρία στοιχεία της τρέχουσας γραμμής από την αρχή του πίνακα [2][0] [2][1] [2][2] [2][3] To στοιχείο manywords[i][j] βρίσκεται στη θέση (char *)manywords+ i*cols+j [2][4] 33 int numbers[2][3][4]; Ένας πίνακας 2 στοιχείων, καθένα από τα οποία είναι πίνακας 3 στοιχείων, καθένα από τα οποία είναι πίνακας 4 στοιχείων καθένα από τα οποία είναι int 34 17

[0][0][0] [0][0][1] [0][0][2] [0][0][3] [0][1][0] [0][1][1] [0][1][2] [0][1][3] [0][2][0] [0][2][1] [0][2][2] [0][2][3] [1][0][0] [1][0][1] [1][0][2] [1][0][3] [1][1][0] [1][1][1] [1][1][2] [1][1][3] [1][2][0] [1][2][1] #include <stdio.h> #include <stdlib.h> void readarray(int *, int, int, int); void printarray(int *, int, int, int); void print3d(int [2][3][4]); int main(int argc, char *argv[]) { int array3d[2][3][4]; readarray( (int *)array3d, 2, 3, 4); printarray((int *)array3d, 2, 3, 4); print3d(array3d); return 0; Εδώ η γεωμετρία του πίνακα είναι παράμετρος Χειρίζεται πίνακες τύπου int [2][3][4] μόνο [1][2][2] [1][2][3] 35 Πίνακας σταθερής γεωμετρίας ως παράμετρος void print3d(int data[2][3][4]) { int i, j, k; for (i = 0; i<2; i++) { for (j=0; j<3; j++) { for (k=0; k<4; k++) printf("%2d ", data[i][j][k]); printf("\n"); printf("\n"); Χειρίζεται πίνακες τύπου int [2][3][4] μόνο 36 18

[0][0][0] [0][0][1] [0][0][2] [0][0][3] int array3d[2][3][4]; h w d [0][1][0] [0][1][1] [0][1][2] [0][1][3] (int *) array3d + i*w*d + j * d + k [0][2][0] [0][2][1] [0][2][2] [0][2][3] 1*w*d = 1 * 3 * 4 [1][0][0] [1][0][1] [1][0][2] 1*d = 1 * 4 [1][0][3] [1][1][0] [1][1][1] [1][1][2] [1][1][3] [1][2][0] [1][2][1] [1][2][2] [1][2][3] 2 Το στοιχείο array3d[1][1][2] βρίσκεται στη θέση (int *) array3d + 1*3*4+ 1*4 + 2 37 Πίνακας σταθερού πλήθους διαστάσεων, όχι προκαθορισμένης γεωμετρίας, ως παράμετρος σε συνάρτηση void readarray(int *data, int h, int w, int d) { int i, j, k,count = 0 ; for (i = 0; i<h; i++) for (j=0; j<w; j++) for (k=0; k<d; k++) *(data + i*w*d + j * d + k) = count ++; void printarray(int *data, int h, int w, int d) { int i, j, k ; for (i = 0; i<h; i++) { for (j=0; j<w; j++) { for (k=0; k<d; k++) Αναφερόμαστε στο στοιχείο [i][j][k] ενός πίνακα [h][w][d] printf("%2d ", *(data + i*w*d + j*d + k)); printf("\n"); printf("\n"); 38 19

[0][0][0] [0][0][1] [0][0][2] [0][0][3] [0][1][0] [0][1][1] [0][1][2] [0][1][3] [0][2][0] [0][2][1] [0][2][2] [0][2][3] [1][0][0] [1][0][1] [1][0][2] [1][0][3] [1][1][0] [1][1][1] [1][1][2] [1][1][3] [1][2][0] [1][2][1] void myread(int *data, int h, int w, int d) { int i=0, count = 0; for (; i< h*w*d; *(data + (i++)) = count ++ ); void myread(int *data, int h, int w, int d) { int i=0; for (; i< h*w*d; *(data + i) = i++ ); void myread(int *data, int h, int w, int d) { int i=0; for (; i< h*w*d; *(data ++) = i++ ); void myread(int *data, int h, int w, int d) { int i=0; for (; (*(data ++) = i++ )< h*w*d;); Σε μερικές περιπτώσεις μπορούμε να κάνουμε αντίστοιχα πράγματα Με λιγότερο κώδικα, αξιοποιώντας τον τρόπο αποθήκευσης στη μνήμη. [1][2][2] [1][2][3] 39 #include <stdio.h> #include <stdlib.h> void readarray(int *, int, int, int); void printarray(int *, int, int, int); void print3d(int [2][3][4]); Ευέλικτος κώδικας int main(int argc, char *argv[]) { int array3d[2][3][4]; int another3d[2][2][2]; Ίδια συνάρτηση, η γεωμετρία ως του πίνακα ως παράμετρος. readarray( (int *)array3d, 2, 3, 4); printarray((int *)array3d, 2, 3, 4); print3d(array3d); readarray( (int *)another3d, 2, 2, 2); printarray((int *)another3d, 2, 2, 2); return 0; 40 20

#include <stdio.h> #include <stdlib.h> Πίνακες πολλών διαστάσεων int main(int argc, char *argv[]) { int array2d[][4] = {{1,2,3,4, {5,6,7,8, {9,10,11,12; int i, j; printf("size of array in bytes: %d\n", sizeof array2d); printf("size of an element: %d\n", sizeof array2d[0]); for (i=0; i< 3; i++) for (j=0; j< 4; j++) printf("%d %d %d\n", i, j, array2d[i][j]); return 0; 41 for (i=0; i< 3; i++) for (j=0; j< 4; j++) printf("%d %d %d\n", i, j, *( array2d[i] + j)); for (i=0; i< 3; i++) for (j=0; j< 4; j++) printf("%d %d %d\n", i, j, *( *(array2d + i) + j)); for (i=0; i< 3; i++) for (j=0; j< 4; j++) printf("%d %d %d\n", i, j, *((int *) array2d + i * 4 + j)); 42 21

To C99 επιτρέπει Variable Length Arrays (VLAs) void test(int rows, int cols, int x[rows][cols]) { /* */ #include <stdio.h> #include <stdlib.h> // // C99 comment style // Demonstration of C99 VLAs // void readarray(int rows, int cols, int x[rows][cols]); void printarray(int rows, int cols, int x[rows][cols]); int main(int argc, char *argv[]) { int a[5][5]; readarray(5, 5, a); printarray(3, 5, a); return 0; void readarray(int rows, int cols, int x[rows][cols]) { int i, j; for (i = 0; i< rows; i++) for (j = 0; j < cols; j++) x[i][j] = -i*cols - j ; void printarray(int rows, int cols, int x[rows][cols]) { int i, j; for (i = 0; i< rows; i++) { for (j = 0; j < cols; j++) printf("%4d", x[i][j]) ; printf("\n"); 22