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

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

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

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

Χpήσιµες Βιβλιοθήκες της γλώσσας C

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

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

Αντικειµενοστρεφής Προγραµµατισµός

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

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Επανάληψη για τις Τελικές εξετάσεις

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

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

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

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

οµές (structures) και Eνώσεις (unions)

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

Γλώσσες Προγραμματισμού

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

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

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

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

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

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

Εισαγωγή στην πληροφορική

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

Συναρτήσεις και διαδικασίες

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

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

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

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

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

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

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

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

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

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

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

Πίνακες. Χρησιμοποιούνται για αποθήκευση συνόλου δεδομένων του ίδιου τύπου. Γραμμική Διάταξη Δήλωση Τύπος Δεδομένων ΌνομαΠίνακα[ length ]

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

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

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

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

Οι δείκτες στη γλώσσα C

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

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

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

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

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

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

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

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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

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

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

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

Συναρτήσεις. Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

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

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

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

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

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

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

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

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

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

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

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

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

Δείκτες στην C (επανάληψη)

Εργαστήριο 9: Αρχεία

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

ΕΠΛ 034: Εισαγωγήστον ΠρογραµµατισµόγιαΗΜΥ

Γλώσσες Προγραμματισμού

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

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

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

Προγραµµατιστικές Τεχνικές

Transcript:

είκτες και Πίνακες (2) Στην ενότητα αυτή θα µελετηθούν τα εξής θέµατα: Πολυδιάστατοι πίνακες Πέρασµα παραµέτρων σε προγράµµατα C ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-1

Πίνακες εικτών Πίνακας δεικτών είναι ένας πίνακας που περιέχει δείκτες. ήλωση πίνακα από δείκτες τύπου type γίνεται ως type *arrayname[arraysize] π.χ. η δήλωση char *a[10] λέει ότι ο a είναι πίνακας µεγέθους 10 και τα στοιχεία του είναι δείκτες σε char. Έτσι το a[6] είναι δείκτης σε χαρακτήρα και *a[6] είναι ο χαρακτήρας στον οποίο δείχνει. Αρχικοποίηση τιµής σε πίνακα δεικτών γίνεται µε τη γνωστή σύνταξη. Παράδειγµα: char *name[] = { Γενάρης, Φεβράρης, Μάρτης, Απρίλης, Μάης, Ιούνης, Ioύλης, Αύγουστος, Σεπτέµβρης, Οκτώβρης, Νοέµβρης, εκέµβρης } ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-2

Παράδειγµα char *name[] = { Γενάρης, Φεβράρης, Μάρτης, Απρίλης, Μάης, Ιούνης, Ioύλης, Αύγουστος, Σεπτέµβρης, Οκτώβρης, Νοέµβρης, εκέµβρης } Γραφικά, έχουµε Γενάρης Φεβράρης...... Νοέµβρης εκέµβρης Oι χαρακτήρες κάθε συµβολοσειράς τοποθετούνται κάπου στη µνήµη και στο name[i] τοποθετείται δείκτης σ αυτούς τους χαρακτήρες. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-3

Παράδειγµα Να γράψετε συνάρτηση που, µε δεδοµένο εισόδου ακέραιο i, επιστρέφει το όνοµα του i-οστού µήνα (αν υπάρχει). char *month_name(int n){ static char *name[] = { Aνύπαρκτος µήνας, Γενάρης, Φεβράρης, Μάρτης, Απρίλης, Μάης, Ιούνης, Ioύλης, Αύγουστος, Σεπτέµβρης, Οκτώβρης, Νοέµβρης, εκέµβρης }; return (n < 1 n > 12? name[0] : name[n] ) } ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-4

Πολυδιάστατοι πίνακες Η C διαθέτει ορθογωνικούς πολυδιάστατους πίνακες. Κατά τη δήλωση ενός πολυδιάστατου πίνακα (όπως και για ένα µονοδιάστατο) πρέπει να προσδιορίσουµε τις διαστάσεις του. π.χ. char array[3][7] Ένας πολυδιάστατος πίνακας είναι ένας µονοδιάστατος πίνακας κάθε στοιχείο του οποίου είναι ένας πίνακας. Για να αναφερθούµε σε κάποιο στοιχείο του πίνακα χρησιµοποιούµε δείκτες θέσης. π.χ. array[i][j] /*[γραµµή][στήλη]*/ Έτσι η έκφραση array[i] επιλέγει το i-οστό στοιχείο του array, έστω b, που είναι πίνακας, και array[i][j]= b[j], επιλέγει το j- οστό στοιχείο του πίνακα b. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-5

Πολυδιάστατοι πίνακες (συν.) Αρχικοποίηση πολυδιάστατου πίνακα Μια λίστα αρχικών τιµών κλεισµένη σε άγκιστρα, όπου κάθε τιµή παίρνει αρχική τιµή από µια αντίστοιχη υπολίστα. π.χ. char daysofmonth[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} } Μεταβίβαση δισδιάστατου πίνακα σε συνάρτηση Η δήλωση των παραµέτρων της συνάρτησης πρέπει να περιλαµβάνει τον αριθµό των στηλών κάθε δισδιάστατου πίνακα. Ο αριθµός των γραµµών είναι αδιάφορος. Για παράδειγµα, όλες οι πιο κάτω δηλώσεις είναι έγκυρες. f( int daysofmonth[2][13] ) {... } f( int daysof month[][13] ) {... } f( int (*daysof month)[13] ) {... } ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-6

Πολυδιάστατοι Πίνακες vs Πίνακες εικτών Έστω int a[10][20]: int *b[10]; Ποια ηδιαφορά ανάµεσα στους δύο πίνακες; ο a είναι πραγµατικά δισδιάστατος πίνακας: κατά τον ορισµό του δεσµεύθηκαν 200 συνεχόµενες θέσεις. Κατά τον ορισµό του b κατανέµεται χώρος για 10 δείκτες. Απόδοση αρχικών τιµών πρέπει να γίνει ρητά είτε στατικά είτε µε κώδικα. Πλεονέκτηµα ενός πίνακα µε δείκτες είναι ότι κάθε δείκτης µπορεί να δείχνει σε γραµµή µε διαφορετικό µήκος ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-7

Παράδειγµα Έστω char *name[] = { Illegal month, Jan, Feb, March } char aname[] [15] = { Illegal month, Jan, Feb, March } Γραφικά στο επίπεδο της µνήµης έχουµε name: Illegal month\0 Jan\0 Feb\0 Μarch\0 aname: Illegal month\0 Jan\0 Feb\0 March\0 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-8

Παράµετροι της συνάρτησης main() Μέχρι τώρα ορίζαµε τη συνάρτηση main µε παράµετρο void θέλοντας να δείξουµε ότι η συνάρτηση main δε δέχεται ορίσµατα. int main(void) {... } Αυτό όµως δε σηµαίνει ότι δεν µπορούµε να περάσουµε ορίσµατα. Τα δυνατά ορίσµατα όµως της main είναι καθορισµένα και είναι τα εξής: int main(int argc, char *argv[]) {... } Tα ορίσµατα περνούνται στο πρόγραµµα από τη γραµµή διαταγών τη στιγµή που αρχίζει η εκτέλεσή του. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-9

Σηµασία των ορισµάτων Το πρώτο όρισµα argc, το οποίο είναι τύπου ακέραιος, είναι ο αριθµός των ορισµάτων της γραµµής διαταγών, µε τα οποία έχει κληθεί το πρόγραµµα. Το δεύτερο όρισµα argv είναι δείκτης για έναν πίνακα συµβολοσειρών ο οποίος περιέχει τα ορίσµατα. Κατά σύµβαση argv[0] είναι το όνοµα µε το οποίο κλήθηκε το πρόγραµµα. argv[1],, argv[argc - 1], είναι τα υπόλοιπα ορίσµατα µε την σειρά που δόθηκαν στη γραµµή εντολής. argc[argc] περιέχει το µηδενικό δείκτη. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-10

Σηµασία των ορισµάτων (συν.) Παράδειγµα: Έστω ένα πρόγραµµα C το οποίο έχει τη µορφή: int main(int argc, char *argv[]) { } Θεωρείστε επίσης ότι το εκτελέσιµο αρχείο του παραπάνω προγράµµατος έχει ονοµαστεί prog. Τότε κατά την κλήση του prog υπό τη µορφή: $ prog opt1 opt2 opt3 έχουµε την εξής ανάθεση τιµών στα ορίσµατα της main: argc = 4 argv[0] = prog argv[1] = opt1 argv[2] = opt2 argv[3] = opt3 argv[4] = ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-11

Παράδειγµα 1 Ζητούµενο: πρόγραµµα που κατά την κλήση του µε n oρίσµατα αντηχεί τα n-1 τελευταία στην οθόνη. Για παράδειγµα αν το πρόγραµµα αυτό λέγεται echo, τότε µία κλήση της µορφής: $ echo Hello world! θα εµφάνιζε στην έξοδο $ Hello world! Οι τυπικές παράµετροι της συνάρτησης main θα έχουν τιµές: argc = 3 argv[0] = echo argv[1] = Hello argv[2] = world! ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-12

Παράδειγµα 1 (συν.) #include <stdio.h> main (int argc, char *argv[]){ int i; } for(i = 1; i < argc; i++) printf( %s%s, argv[i], (i < argc - 1)? : ); printf( \n ); return 0; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-13

Παράδειγµα 1 (συν.) #include <stdio.h> main (int argc, char *argv[]){ int i; } while(--argc > 0) printf( %s%s, *++argv, (argc > 1)? : ); printf( \n ); return 0; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-14

Παράδειγµα 2 Ζητούµενο: πρόγραµµα που παίρνει κατά την κλήση του όρισµα που χρησιµοποιεί για να φιλτράρει από το δεδοµένο εισόδου του τις γραµµές που περιέχουν τον συγκεκριµένο συνδυασµό χαρακτήρων. Για παράδειγµα αν το πρόγραµµα ονοµάζεται filter τότε κατά την κλήση $ filter Προγραµµα µε δεδοµένο εισόδου ΕΠΛ132 Αρχές Προγραµµατισµού ΙΙ ΕΠΛ231 οµές εδοµένων και Αλγόριθµοι ΕΠΛ233 Αντικειµενοστρεφής Προγραµµατισµός το πρόγραµµα θα πρέπει να επιστρέψει ΕΠΛ132 Αρχές Προγραµµατισµού ΙΙ ΕΠΛ233 Αντικειµενοστρεφής Προγραµµατισµός ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-15

Παράδειγµα 2 οµή το προγράµµατος. while (υπάρχει κι άλλη γραµµή) if (η γραµµή περιέχει τον συνδυασµό που δοθηκε σαν όρισµα στην main) εµφάνισε την γραµµή Θα χρησιµoποιήσουµε δύο συναρτήσεις εκτός από την main. την getline (διάλεξη 1), και την strstr(s,t) (της πρότυπης βιβλιοθήκης, κάτω από την επικεφαλίδα string.h). Αυτή η συνάρτηση επιστρέφει ένα δείκτη για την πρώτη εµφάνιση της συµβολοσειράς t µέσα στη συµβολοσειρά s, ή NULL αν δεν εµφανίζεται καθόλου. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-16

#include <stdio.h> #include <string.h> #define MAXLINE = 1000 Παράδειγµα 2 (συν.) int getline(char *line, int max); main(int argc, char *argv[]){ char line[maxline]; } if (argc!= 2) printf( Λανθασµένη χρήση του προγράµµατος grep ); else while (getline(line, MAXLINE) > 0) if (strstr(line, argv[1])!= NULL) printf( %s, line); return 0; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-17

Εργασία Να επεκτείνετε το µοντέλο επιτρέποντας τη χρήση δύο προαιρετικών ορισµάτων: το όρισµα -x λέει εµφάνισε τις γραµµές εκτός αυτές που περιέχουν τον συνδυασµό που ακολουθεί. το όρισµα -n λέει εµφάνισε τις γραµµές αριθµηµένες. Τα ορίσµατα πρέπει να µπορούν να εµφανίζονται µε οποιαδήποτε σειρά και να συνδυάζονται. Έτσι αν το πρόγραµµα λέγεται find, οι κλήσεις find -x -n συνδυασµός find -n -x συνδυασµός find -xn συνδυασµός θα πρέπει να εµφανίζουν κάθε γραµµή του δεδοµένου εισόδου που δεν ταιριάζει µε τον συνδυασµό, µε τον αριθµό της µπροστά της, ενώ η κλήση find -n θα πρέπει απλά να εµφανίζει τις γραµµές αριθµηµένες κλπ. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-18