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

Σχετικά έγγραφα
Προγραμματισμός Υπολογιστών με C++

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

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

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

Σημειώσεις όγδοης εβδομάδας

Διάλεξη 18η: Διαχείρηση Αρχείων

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

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

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

υναµικές οµές εδοµένων

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

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

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

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

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

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

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

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

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

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

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

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

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

i M-1 1. ij f(i, j) N-1. (pixel) 2. M N (x, y) (x, y ) = 256. R(x, y), G(x, y), B(x, y)

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

Διάλεξη 15η: Αναδρομή, μέρος 1ο

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

Στοίβες με Δυναμική Δέσμευση Μνήμης

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

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

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

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Περιεχόμενα. Πρόλογος... 21

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

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

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

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

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

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

ιαφάνειες παρουσίασης #6 (β)

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Αρχεία Κεφαλίδων ΑΡΧΕΙΑ ΚΕΦΑΛΙΔΩΝ. Γεώργιος Παπαϊωάννου ( )

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

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

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

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

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

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

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

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

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

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

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

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

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

Περιεχόμενα. Πρόλογος... 17

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

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

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

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

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Αλγόριθμοι Ταξινόμησης Μέρος 1

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

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

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

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

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

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

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

Λειτουργικά Συστήματα

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

(programming interfaceή/και application programming interface API).

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

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

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

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

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

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

Δομές δεδομένων (2) Αλγόριθμοι

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

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

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

Transcript:

Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 20η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1

Τι θα ακούσετε σήμερα Υλοποίηση στοίβας σε C. 2

Αναπαράσταση στοίβας StackNode n1 value 10 top Stack s counter 3 StackNode n2 value 30 StackNode n3 value 20 0 3

Η δομή (struct) StackNode struct snode { int value; struct snode* ; ; «δομές»: Μοιάζουν με τις τάξεις της C++, αλλά δεν μπορούν να έχουν μεθόδους και όλα τα μέλη είναι δημόσια. Πρέπει να γράφουμε και το «struct» όποτε χρησιμοποιούμε αυτόν τον τύπο (π.χ. «struct snode n3;» ή «struct snode* ;»). typedef struct snode StackNode; ή και τα δύο μαζί: typedef struct snode { int value; struct snode* ; StackNode; Μας επιτρέπει να γράφουμε «StackNode» αντί για «struct snode». Δουλεύει και με άλλους τύπους (π.χ. «typedef int akeraios»). 4

Το αρχείο κεφαλίδας stack.h #ifndef _STACK_H_ #define _STACK_H_ #include <stdio.h> typedef struct snode { int value; struct snode* ; StackNode; typedef struct { StackNode* top; unsigned int counter; Stack; void stackinit(stack* stackptr); unsigned int stacklength(stack* stackptr); void push(stack* stackptr, int valuein); int pop(stack* stackptr); #endif Χωρίς όνομα μετά το struct. Δεν μας χρειάζεται σε αυτή την περίπτωση. Αντί για κατασκευαστή. Θα μεταβιβάζουμε το Stack που θέλουμε να αρχικοποιήσουμε (άρα να τροποποιήσουμε) κατά αναφορά με χρήση δείκτη (δεν υπάρχουν αναφορές). Είναι μεμονωμένες συναρτήσεις, όχι μέθοδοι τάξεως (δεν έχουμε τάξεις). 5

Οι stackinit και stacklength void stackinit(stack* stackptr) { Stack checknullpointer(stackptr, "stackinit"); stackptr->top = 0; top 0 stackptr->counter = 0; counter 0 stackptr Όταν δημιουργούμε μια νέα στοίβα, θα καλούμε την stackinit για να αρχικοποιήσουμε τα top, counter. Δεν έχουμε κατασκευαστές. Η checknullpointer ελέγχει μήπως ο stackptr δείχνει στο 0. Αν ναι, τερματίζει την εκτέλεση του προγράμματος. unsigned int stacklength(stack* stackptr) { checknullpointer(stackptr, "stacklength"); return stackptr->counter; 6

Η συνάρτηση pop int pop(stack* stackptr) { StackNode* newtop; int valuetoreturn; checknullpointer(stackptr, "pop"); if(stackptr->counter = = 0) { fprintf(stderr, "%s: pop called \ with empty stack.\n", programname); exit(1); newtop = stackptr->top->; valuetoreturn = stackptr->top->value; free(stackptr->top); stackptr->top = newtop; stackptr->counter--; top return valuetoreturn; stackptr newtop Stack s counter 3 StackNode n1 value 10 StackNode n2 value 30 StackNode n3 value 20 0 7

Η συνάρτηση push void push(stack* stackptr, int valuein) { StackNode* newtop; checknullpointer(stackptr, "push"); newtop = (StackNode*)malloc(sizeof(StackNode)); newtop->value = valuein; newtop-> = stackptr->top; stackptr->top = newtop; stackptr->counter++; stackptr top Stack s counter 3 StackNode n1 value 10 StackNode n2 value 30 StackNode n3 value 20 newtop 0 8

Περισσότερα για τη malloc Δεν υπάρχει new στη C. Η malloc απαιτεί ως όρισμα το μέγεθος του αιτούμενου χώρου μνήμης. Το sizeof(stacknode) υπολογίζει πόσο χώρο μνήμης απαιτεί μια δομή StackNode. H sizeof μπορεί να χρησιμοποιηθεί και με άλλους τύπους (π.χ. sizeof(int)). Υπάρχει και στη C++. Η malloc επιστρέφει δείκτη σε char. Μετατρέπουμε σε StackNode* το δείκτη που επιστρέφει. Διαφορετικά οι περισσότεροι μεταγλωττιστές τυπώνουν προειδοποίηση κατά την εκχώρηση του αποτελέσματος της malloc στο δείκτη newtop (που είναι τύπου StackNode*). 9

H checknullpointer καθολική μεταβλητή void*: Για οποιονδήποτε τύπο δείκτη... void checknullpointer(void* pointer, char* functionname) { if(pointer = = 0) { fprintf(stderr, "%s: null pointer passed to function %s.\n", programname, functionname); exit(1); 10

Το αρχείο stack.c #include "stack.h" Χρήση καθολικής μεταβλητής που έχει δηλωθεί σε άλλο αρχείο.c. extern char programname[]; void checknullpointer(void* pointer, char* functionname) { if(pointer = = 0) { fprintf(stderr, "%s: null pointer passed to function %s.\n", programname, functionname); exit(1); void stackinit(stack* stackptr) { /* Όπως πριν... Ακολούθως οι ορισμοί των υπολοίπων συναρτήσεων. */ 11

Το αρχείο main.c #include <stdio.h> #include <string.h> #include "stack.h" #define PROGRAM_NAME_LENGTH 10 char programname[program_name_length]; int main(int argc, char **argv) { FILE* inputfile; Stack mystack; int inputvalue; strncpy(programname, argv[0], PROGRAM_NAME_LENGTH - 1); if(argc!= 2) { fprintf(stderr, "%s: bad number of arguments.\n", programname); exit(1); if((inputfile = fopen(argv[1], "r")) = = NULL) { fprintf(stderr, "%s: could not open input file.\n", programname); exit(1); 12

Το αρχείο main.c συνέχεια... stackinit(&mystack); while(fscanf(inputfile, "%d", &inputvalue)!= EOF) { printf("value read: %d\n", inputvalue); push(&mystack, inputvalue); fclose(inputfile); printf("number of values pushed: %d\n", stacklength(&mystack)); while(stacklength(&mystack)!= 0) { printf("popped value: %d\n", pop(&mystack)); 13