Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες"— Μεταγράφημα παρουσίασης:

1 Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες

2 printf() Πιθανά ορίσματα: Κυριολεκτικό κείμενο Ακολουθία διαφυγής
Επιτρέπει την εμφάνιση ειδικών χαρακτήρων Προσδιοριστής μετατροπής Καθορίζει πώς θα ερμηνευτούν οι μεταβλητές που πρόκειται να προβληθεί

3 Ακολουθίες διαφυγής \a Κουδούνι \n Νέα γραμμή
\\ ανάστροφη κεκλιμένη γραμμή \? ερωτηματικό \' απόστροφος \" εισαγωγικό \t χαρακτήρας στηλοθέτη

4 Προσδιοριστές μετατροπής
%c char %d int, short %f float %s συμβολοσειρές %u μη προσημασμένοι ακέραιοι

5 Παράδειγμα (1/3) /* Demonstration of frequently used escape sequences */ #include <stdio.h> #define QUIT 3 int get_menu_choice( void ); void print_report( void ); int main(void) { int choice = 0; while( choice != QUIT ) { choice = get_menu_choice(); if( choice == 1 ) printf( "\nBeeping the computer\a\a\a" ); else { if( choice == 2 ) print_report(); }

6 Παράδειγμα (2/3) printf( "You chose to quit!" ); } /*main*/ int get_menu_choice( void ) { int selection = 0; do { printf( "\n" ); printf( "\n1 - Beep Computer" ); printf( "\n2 - Display Report"); printf( "\n3 - Quit"); printf( "\nEnter a selection:" ); scanf( "%d", &selection ); }while ( selection < 1 || selection > 3 ); return selection; }

7 Παράδειγμα (3/3) void print_report( void ) { printf( "\nSAMPLE REPORT" ); printf( "\n\nSequence\tMeaning" ); printf( "\n=========\t=======" ); printf( "\n\\a\t\tbell (alert)" ); printf( "\n\\b\t\tbackspace" ); printf( "\n...\t\t..."); }

8 Παράδειγμα (1/1) /* Demonstration using print() to display numerical values. */ #include <stdio.h> int a = 2, b = 10, c = 50; float f = 1.05, g = 25.5, h = -0.1; int main(void) { printf("\nDecimal values without tabs: %d %d %d", a, b, c); printf("\nDecimal values with tabs: \t%d \t%d \t%d", a, b, c); printf("\nThree floats on 1 line: \t%f\t%f\t%f", f, g, h); printf("\nThree floats on 3 lines: \n\t%f\n\t%f\n\t%f",f,g,h); printf("\nThe rate is %f%%", f); printf("\nThe result of %f/%f = %f", g, f, g / f); }

9 Προσοχή Για κάθε μεταβλητή που προβάλλουμε πρέπει να υπάρχει αντίστοιχος προσδιοριστής Εάν υπάρχουν περισσότερες μεταβλητές ΔΕΝ θα προβληθούν Εάν υπάρχουν περισσότεροι προσδιοριστές θα εμφανιστούν 'σκουπίδια'

10 Προσοχή Καλύτερα να προβάλλετε πολλές γραμμές κειμένου με περισσότερες εντολές printf(). Βοηθά στην αναγνωσιμότητα του κώδικα. Μην ξεχνάτε το αρχείο stdio.h

11 puts() Η puts() μπορεί να εμφανίσει μηνύματα κειμένου όχι όμως και μεταβλητές puts("Καλημέρα κόσμε"); printf("Καλημέρα κόσμε\n"); Μπορείτε να χρησιμοποιήσετε ακολουθίες διαφυγής Δε μπορείτε να χρησιμοποιήσετε προσδιοριστές μετατροπής

12 scanf() Απαιτείται το σύμβολο & πριν το όνομα της μεταβλητής
scanf("%d", &x); scanf("%f", &f); scanf("%d, %f", &x, &f); Απαιτείται το σύμβολο & πριν το όνομα της μεταβλητής Οι τιμές που εισάγονται διαχωρίζονται με κενό, tab, ή νέα γραμμή

13 Παράδειγμα (1/3) /* Demonstration on using scanf() */ #include <stdio.h> #define QUIT 4 int get_menu_choice( void ); int main(void) { int choice = 0; int int_var = 0; float float_var = 0.0; unsigned unsigned_var = 0; while( choice != QUIT ) { choice = get_menu_choice(); if( choice == 1 ) { puts( "\nEnter a signed decimal integer (i.e. -123)" ); scanf( "%d", &int_var ); }

14 Παράδειγμα (2/3) if ( choice == 2 ) { puts( "\nEnter a decimal floating point number (i.e. 1.23)" ); scanf( "%f", &float_var ); } if ( choice == 3 ) { puts( "\nEnter an unsigned decimal integer (i.e. 123)" ); scanf( "%u", &unsigned_var ); printf( "\nYour values are: int: %d float: %f unsigned: %u ",int_var, float_var, unsigned_var );

15 Παράδειγμα (3/3) int get_menu_choice( void ) { int selection = 0; do { puts( "\n1 - Get an signed decimal integer" ); puts( "2 - Get a decimal floating point number" ); puts( "3 - Get an unsigned decimal integer" ); puts( "4 - Quit" ); puts( "\nEnter a selection:" ); scanf( "%d", &selection ); }while ( selection < 1 || selection > 4 ); return selection; }

16 Βρείτε τα σφάλματα printf("\n I say: "Good morning""); int get_1_or_2(void) { int answer = 0; while (answer < 1 || answer > 2) { printf(Enter 1 for Yes, 2 for No); scanf(answer); } return answer;

17 Λίγα για πίνακες (1/3) Πίνακας (διάταξη): μια ομάδα στοιχείων ιδίου τύπου Τα στοιχεία διαχωρίζονται μεταξύ τους με χρήση δείκτη Πίνακας: μια ή περισσότερες διαστάσεις Ορισμός: int data[1000]; Ορίζει έναν πίνακα με 1000 θέσεις ακεραίων Το πρώτο στοιχείο βρίσκεται στη θέση data[0]

18 Λίγα για πίνακες (2/3) Μπορούμε να δώσουμε τιμή σε μια θέση του πίνακα: data[10] = 12; ή εάν έχουμε ορίσει int count = 10; data[count] = 12; Ποιος είναι ο δείκτης του τελευταίου στοιχείου του πίνακα data[] ;

19 Λίγα για πίνακες (3/3) Ο πίνακας μπορεί να έχει πάνω από μία διαστάσεις char crossword[15][15]; πίνακας χαρακτήρων 15 γραμμών και 15 στηλών int a[50][100]; πίνακας ακεραίων με 50 γραμμές και 100 στήλες double b[10][20][30]; Αναφερόμαστε σε ένα στοιχείο του πίνακα παραθέτοντας δείκτες για όλες τις διαστάσεις crossword[3][5] = 'A'; b[2][7][9] = 7.2;

20 Περισσότεροι Πίνακες Είδαμε τους μονοδιάστατους πίνακες
Με τη δήλωση ενός πίνακα ο μεταγλωττιστής κρατά αντίστοιχο χώρο στη μνήμη

21 Παραδείγματα float expenses[100]; int a[10]; int i = 5; expenses[i] = 100; expenses[2 + 3] = 100; a[2] = 5; expenses[a[2]] = 100;

22 Πολυδιάστατοι πίνακες
int checker[8][8]; checker[0][0] = 1; checker[1][0] = 2; #define MONTHS 12 int array[MONTHS] /* Δεκτό */ const int MONTHS=12; int array[MONTHS] /* Λάθος! */

23 Απόδοση αρχικών τιμών int array[4] = {100, 200, 300, 400}; int array[] = {100, 200, 300, 400}; int array[14] = {100, 200, 300, 400}; int array[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; array[0][0] = 1; array[0][1] = 2; array[0][2] = 3; array[1][0] = 4; array[1][1] = 5; array[1][2] = 6; ... array[3][2] = 12;

24 Απόδοση αρχικών τιμών Δεκτό: int array[][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; Μη δεκτό: int array[3][] = {1,2,3,4,5,6,7,8,9,10,11,12};

25 Παράδειγμα (1/2) /* Demonstrates the sizeof() operator */ #include <stdio.h> /* Declare several 100 element arrays */ int intarray[100]; float floatarray[100]; double doublearray[100]; int main(void) { /* Display the sizes of numeric data types */ printf("\n\nSize of int = %d bytes", sizeof(int)); printf("\nSize of short = %d bytes", sizeof(short)); printf("\nSize of long = %d bytes", sizeof(long)); printf("\nSize of float = %d bytes", sizeof(float)); printf("\nSize of double = %d bytes", sizeof(double));

26 Παράδειγμα (2/2) /* Display the sizes of the three arrays */ printf("\nSize of intarray = %d bytes", sizeof(intarray)); printf("\nSize of floatarray = %d bytes", sizeof(floatarray)); printf("\nSize of doublearray = %d bytes", sizeof(doublearray)); }

27 Ερωτήσεις Τι συμβαίνει αν χρησιμοποιήσω έναν δείκτη εκτός του αριθμού των στοιχείων του πίνακα; Τι συμβαίνει αν χρησιμοποιήσω έναν πίνακα χωρίς να δώσω αρχικές τιμές; Πόσες διαστάσεις μπορεί να έχει ένας πίνακας; Υπάρχει εύκολος τρόπος απόδοσης αρχικών τιμών σε ένα πίνακα; Μπορώ να κάνω πράξεις πινάκων;

28 Βρείτε το σφάλμα int x, y; int array[10][3]; int main(void){ for (x = 0; x < 3; x++) for (y = 0; y < 10; y++) array[x][y] = 0; return 0; }

29 Βρείτε το σφάλμα int x = 1; int array[10]; int main(void){ for (x = 1; x <= 10; x++) array[x] = 0; return 0; }

30 Δείκτες

31 Η μνήμη του υπολογιστή Η μνήμη αποτελείται από διαδοχικές θέσεις αποθήκευσης Κάθε θέση αναγνωρίζεται από μοναδική διεύθυνση (0…μέγιστη μνήμη) Όταν δηλώνετε μια μεταβλητή δεσμεύεται μια αντίστοιχη θέση στη μνήμη Η διεύθυνση της μνήμης δεν είναι άμεσα γνωστή σε εσάς

32 Δημιουργία δείκτη Η διεύθυνση είναι ένας αριθμός!
Μπορείτε, για παράδειγμα, σε μια μεταβλητή να αποθηκεύσετε τη διεύθυνση μνήμης μιας άλλης μεταβλητής Δείτε τα ακόλουθα παραδείγματα

33 Ορισμός μεταβλητής 1000 1001 1002 1003 1004 1005 1006 1007 100 rate
? 100 p_rate rate 1000 1001 1002 1003 1004 1005 1006 1007 1004 100 p_rate rate

34 Δήλωση δεικτών Για να ξεχωρίζουμε εύκολα τους δείκτες, στα παραδείγματα χρησιμοποιούμε το p_ Δήλωση δείκτη: τύπος *όνομα_δείκτη; char *ch1, *ch2; float *value, percent; ο αστερίσκος είναι ο τελεστής έμμεσης διευθυνσιοδότησης

35 Αρχικοποίηση δεικτών Για να δώσετε τη διεύθυνση μιας μεταβλητής σε ένα δείκτη χρησιμοποιείτε τον τελεστή διεύθυνσης (&) δείκτης = &μεταβλητή; p_rate = &rate; Πριν την απόδοση τιμής η p_rate δεν 'έδειχνε' σε κάτι συγκεκριμένο.

36 Χρήση δεικτών Όταν το * προτίθεται στο όνομα ενός δείκτη αναφερόμαστε στη μεταβλητή που δείχνει ο δείκτης! οπότε τα επόμενα είναι ισοδύναμα: printf("%d", rate); printf("%d", *p_rate);

37 Χρήση δεικτών Άμεση πρόσβαση: αναφορά στο όνομα μιας μεταβλητής
Έμμεση πρόσβαση: πρόσβαση με χρήση δείκτη Δείτε το ακόλουθο παράδειγμα

38 Παράδειγμα αναφοράς 1000 1001 1002 1003 1004 1005 1006 1007 1004 100 p_rate rate *p_rate *p_rate : η τιμή που έχει η θέση μνήμης p_rate

39 Ερωτήσεις Έστω ότι έχετε τις ακόλουθες δηλώσεις:
int *ptr, var = 5; ptr = &var; Σε τι αναφέρονται τα ακόλουθα: *ptr, var, ptr, &var Εκτελέστε το ακόλουθο παράδειγμα.

40 Παράδειγμα /* Demonstrates basic pointer use. */ #include <stdio.h> /* Declare and initialize an int variable */ int var = 1; /* Declare a pointer to int */ int *ptr; int main(void) { /* Initialize ptr to point to var */ ptr = &var; /* Access var directly and indirectly */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); /* Display the address of var two ways */ printf("\n\nThe address of var = %d", &var); printf("\nThe address of var = %d", ptr); }

41 Προσοχή ΜΗ χρησιμοποιείτε δείκτη χωρίς να του έχετε δώσει αρχική τιμή.
ΜΗ χρησιμοποιείτε δείκτη χωρίς να του έχετε δώσει αρχική τιμή. Προσέξτε τις διαφορές ανάμεσα στα ptr και *ptr Π.χ. τι κάνει η ακόλουθη δήλωση; *ptr = 120;

42 Δείκτες και Τύποι μεταβλητών
Διαφορετικοί τύποι μεταβλητών καταλαμβάνουν διαφορετικό χώρο στη μνήμη Η διεύθυνση μιας μεταβλητής είναι η διεύθυνση του πρώτου byte που καταλαμβάνει Δείτε το ακόλουθο παράδειγμα

43 Παράδειγμα (1/2) int integer_variable = 12252; char character_variable = 90; float real_variable = ; Η int καταλαμβάνει 2 bytes, η char καταλαμβάνει 1 byte, η float καταλαμβάνει 4 bytes.

44 Παράδειγμα (2/2) character_variable real_variable integer_variable 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 12252 90 int *p_integer; char *p_character; float *p_real; p_integer = &integer_variable; p_character = &character_variable; p_real = &real_variable;

45 Το όνομα πίνακα ως δείκτης
Ένα όνομα πίνακα χωρίς αγκύλες είναι ένας δείκτης στο πρώτο στοιχείο του πίνακα data == &data[0] είναι αληθής έκφραση Ως δείκτης δεν μπορεί να αλλάξει (δείχνει πάντα στην ίδια θέση) Μπορείτε να βάλετε έναν άλλο δείκτη να δείχνει στον πίνακα int array[100], *p_array; p_array = array; /* Δε χρειάζεται ο & */

46 Αποθήκευση στοιχείων πίνακα
int array[5]; 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 array[0] array[1] array[2] array[3] array[4] Η array (χωρίς αγκύλες) είναι η διεύθυνση του πρώτου στοιχείου του πίνακα float expenses[2]; 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 expenses[0] expenses[1]

47 Αριθμητική δεικτών Έστω ότι ptr_2_int είναι μεταβλητή-δείκτης προς κάποιο στοιχείο ενός πίνακα ακεραίων Εάν το αυξήσετε η τιμή του (εφόσον είναι τύπου int) αυξάνει κατά δύο ώστε να δείχνει στο επόμενο στοιχείο του πίνακα Αντίστοιχα για float θα αυξηθεί κατά 4

48 Παράδειγμα /* Δείχνει τη χρήση της αριθμητικής δεικτών για πρόσβαση σε στοιχεία πίνακα με σημειογραφία δεικτών */ #include <stdio.h> #define MAX 10 int i_array[MAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *i_ptr, count; float f_array[MAX] = {.0,.1,.2,.3,.4,.5,.6,.7,.8,.9}; float *f_ptr; int main(void){ i_ptr = i_array; f_ptr = f_array; for (count = 0; count < MAX; count++) printf("%d\t%f\n", *i_ptr++, *f_ptr++); return 0; }

49 Προσοχή Τι θα συμβεί αν γράψω το ακόλουθο;
int *ptr; *ptr = 12; Αφαίρεση ή πρόσθεση σε δείκτη τον αλλάζει ανάλογα με τον τύπο του! *(array) == array[0] ; *(array + 1) == array[1]; *(array + 2) == array[2] . . . *(array + n) == array[n]

50 Πίνακας ως όρισμα συνάρτησης
Μια συνάρτηση δεν μπορεί να δεχτεί ως όρισμα ολόκληρο πίνακα Η λύση: δέχεται δείκτη! Επόμενο πρόβλημα: πώς θα φτιάξετε μια γενική συνάρτηση Ειδική τιμή Μέγεθος πίνακα

51 Παράδειγμα (1/2) /* Passing an array to a function. */ #include <stdio.h> #define MAX 10 int array[MAX], count; int largest(int x[], int y); int main(void) { /* Input MAX values from the keyboard. */ for (count = 0; count < MAX; count++) { printf("Enter an integer value: "); scanf("%d", &array[count]); } /* Call the function and display the return value. */ printf("\n\nLargest value = %d", largest(array, MAX));

52 Παράδειγμα (2/2) /* Function largest() returns the largest value */ /* in an integer array */ int largest(int x[], int y) { int count, biggest = ; for ( count = 0; count < y; count++) { if (x[count] > biggest) /* Πώς θα το γράφαμε ως δείκτη;;;; */ biggest = x[count]; } return biggest;

53 Παράδειγμα (1/2) /* Εναλλακτική λύση */ /* Passing an array to a function. Alternative way. */ #include <stdio.h> #define MAX 10 int array[MAX+1], count; int largest(int x[]); int main(void) { /* Input MAX values from the keyboard. */ for (count = 0; count < MAX; count++) { printf("Enter an integer value: "); scanf("%d", &array[count]); if ( array[count] == 0 ) count = MAX; /* will exit for loop */ } array[MAX] = 0;

54 Παράδειγμα (2/2) /* Call the function and display the return value. */ printf("\n\nLargest value = %d", largest(array)); } /* End MAIN */ /* Function largest() returns the largest value */ /* in an integer array */ int largest(int x[]) { int count, biggest = ; for ( count = 0; x[count] != 0; count++) { if (x[count] > biggest) biggest = x[count]; } return biggest;


Κατέβασμα ppt "Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google