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

Σχετικά έγγραφα
Αρχές Προγραμματισμού

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

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

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στους Υπολογιστές

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

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

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

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

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

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

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

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

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

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

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

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Εισαγωγή στον δομημένο προγραμματισμό

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

Εισαγωγή στον δομημένο προγραμματισμό

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

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

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

Οντοκεντρικός Προγραμματισμός

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

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

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

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

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

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

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

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

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

Εισαγωγή στον δομημένο προγραμματισμό

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

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Προέλευση της Pazcal ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

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

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

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

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

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

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

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

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

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

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

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

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Eισαγωγή στον Προγραμματισμό

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

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Ηλεκτρονικοί Υπολογιστές

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

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

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

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

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

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

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

Εισαγωγή στους Υπολογιστές

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

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

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

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

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

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

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

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

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

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

Transcript:

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 10 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών & Τεχνολογίας Υπολογιστών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τυπου άδειας χρησης, η άδεια χρησης αναφερεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου των διδασκόντων καθηγητών. Το έργο «Ανοικτά Ακαδήμαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτηθεί μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκη Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικους πόρους. 3

Ανάπτυξη Το παρόν εκπαιδευτικό υλικό αναπτύχθηκε στο τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών του Πανεπιστημίου Πατρών 4

Project σε Dev-C++ 5

Δείκτες (Pointers) Δείκτης: μεταβλητή στην οποία αποθηκεύουμε διεύθυνση θέσης μνήμης. δείχνει που είναι αποθηκευμένα δεδομένα Δήλωση Δείκτη <τύπος> *<όνομα δείκτη>; ΠΡΟΣΟΧΗ: Το όνομα πίνακα είναι διεύθυνση, αλλά δεν είναι μεταβλητή!!! 6

Παράδειγμα δήλωσης δείκτη char *ch_ptr; H μεταβλητή ch_ptr περιέχει διεύθυνση μνήμης στην οπ οία είναι αποθηκευμένο δεδομένο τύπου χαρακτήρα. char ch; Η μεταβλητή ch έχει ως αξία χαρακτήρα. Μπορούμε να δηλώσουμε δείκτες σε δεδομένα διαφόρων τύπων Βασικών τύπων Κατασκευασμένων τύπων 7

Παράδειγμα χρήσης δείκτη void main ( ) { char ch = 'a', ch2; char *ch_ptr ; Δήλωση δείκτη σε χαρακτήρα ch_ptr = &ch ; ch2 = *ch_ptr ; printf ("%c", ch2); * Περιεχόμενα της θέσης στην οποία δείχνει ο δείκτης 8

int arr[10], n ; *(arr + n) arr[n] arr + n &arr[n] Πίνακες και δείκτες αλλά και n[arr] *(n+arr) // (!!!) χρησιμοποιούμε δείκτες για να περάσουμε ως όρισμα σε συνάρτηση πίνακες ακριβέστερα: σε ποια διεύθυνση μνήμης βρίσκεται το πρώτο στοιχ είο του πίνακα. 9

#include <stdio.h> #include <stdlib.h> int main(int 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; 10

Διεύθυνση 28FF18 28FF19 Χάρτης μνήμης Περιεχόμενα μν ήμης σε hex 1E FF 28FF1A 28 28FF1B 00 28FF1C 28FF1E 61 ch 28FF1F 61 ch2 Όνομα μεταβλ ητής ch_ptr 11

H συνάρτηση getchar() Διαβάζει έναν χαρακτήρα από την είσοδο. 12 12

Μερικές συναρτήσεις βασικής βιβλιοθήκης για αλφαριθμητικά πρότυπα στο <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 *) ; 13

Συναρτήσεις για προκαθορισμένο πλήθος χαρακτήρων - παραδείγματα #include <string.h> int strncmp(const char *s1, const char *s2, size_t n); char *strncpy(char *s1, const char *s2, size_t n); 14

Παράδειγμα Διάβασε ένα αλφαριθμητικό Μέτρησε πόσες φορές περιλαμβάνει τον χ αρακτήρα a Tύπωσε το αποτέλεσμα. void readstring(char *) ; int counta(char *); void printresult( int ) ; 15

H main ( ) του παραδείγματος main ( ) { char astring[n]; int acount ; readstring (astring) ; acount = counta(astring); printresult(acount) ; #define N 50 #include <stdio.h> void readstring(char *) ; int counta(char *); void printresult( int ) ; void readstring(char *s ) { printf ("alpharithmitiko? "); scanf("%s", s); void printresult ( int a) { printf("the result is %d\n", a); 16

Υλοποίηση της 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 κατά ένα προχώρησε στον επόμενο χαρακτήρα του αλφαριθμητικού 17

Πρόθεμα και Επίθεμα prefix και postfix) i++; /*postfix */ ++ i; /* prefix */ i = 0; myprint(i++); i = 0; myprint(++i); H myprint ( ) καλείται με διαφορετικό όρισμα (διαφορετική τιμή) στις δύο περιπτώσεις! 18

Πρόβλημα Πώς θα γράφαμε πρότυπο και τον ορισμό συνάρτησης η οποία θα δέχεται ως ορίσματα: α) το αλφαριθμητικό και β) τον χαρακτήρα για τον οποίο γίνεται ο έλεγχος. Πρότυπο αυτής: int countchar(char *, char); Παράδειγμα κλήσης acount = countchar(astring, 'a'); Τι πλεονεκτήματα έχει να γράφουμε γενικότερο κώδικα; 19

Χρήση της countchar(char *, char) main ( ) { char astring[n]; int acount ; main ( ) readstring (astring) ; acount = countchar(astring, a ); printresult(acount) ; readstring ( ) astring countchar ( ) acount printresult a 20

Πιθανές υλοποιήσεις 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 ; 21

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; while ( s[i] ) postfix notation count += (s[i++] == c); return count ; 22

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)); 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 ; int countchar(char *s, char c) { int count = 0 ; int i = 0; for( ; s[i]; count += (s[i++] == c)); return count ; 23

Πίνακας αλφαριθμητικών #define N 3 #include <stdio.h> Ο πίνακας 2-D λειτουργεί ως πίνακας 1-D με στοιχεία πίνακες 1-D. main ( ) { int i ; char text[n][11] ={"dokimi", "test", "paradeigma"; 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 24

Παράδειγμα #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); 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); return 0; 25

Παράδειγμα #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++])) ; Προσοχή: Δεν περιλαμβάνει τις αλφαριθμητικές σταθερές! 26

Οργάνωση μνήμης και πίνακες δεικτών σε χαρακτήρες Οι αλφαριθμητικές σταθερές της αρχικοποίησης αποθηκεύονται σε άλλη περιοχή μνήμης. char *text2[3]; text2[0] text2[1] text2[2] 4 bytes 4 bytes 4 bytes dokimi\0 test\0 paradeigma\0 text2: περιλαμβάνει τρεις διευθύνσεις, όχι τα ίδια τα αλφαριθμητικά. 27

Δήλωση και αρχικοποίηση main ( ) { char name[10] = "katerina"; printf ("%s", name); scanf("%s", name); printf ("%s", name); 28

Δήλωση και ανάθεση τιμής σε αλφαριθμητικό char *strcpy(const char *, const char*); main ( ) { char name[10]; name = "katerina"; Λάθος (στη C) 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); 29

Τι γίνεται με δείκτες; #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 () ) 30

Σημείωμα αναφοράς Copyright Πανεπιστήμιο Πατρών, Παλιουράς Βασίλειος, Δερματάς Ευάγγελος «Αρχές Προγραμματισμού». Έκδοση: 1.0. Πάτρα 2015 Διαθέσιμο από τη δικτυακιακή διέυθυνση https://eclass.upatras.gr/modules/ 31