Ερωτήσεις προόδου C Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα. #include <stdio.h> // δίνει οδηγία στον compiler να // συμπεριλάβει την βιβλιοθήκη stdio int main() { // η κυρίως συνάρτηση όπου αρχίζει η // εκτέλεση του // κάθε προγράμματος C printf("hello World"); // εκτυπώνει τη φράση Hello World return 0; // τερματίζει το πρόγραμμα και // επιστρέφει στο ΛΣ τη τιμή 0 Ποιοι είναι οι βασικοί τύποι δεδομένων στη γλώσσα C; int float char integer, ακέραιοι floating point, κινητής υποδιαστολής ή πραγματικοί αριθμοί character, χαρακτήρες Δηλώστε τρεις μεταβλητές τύπου int, float, char και δώστε αρχική τιμή στη δήλωση τους. int a = 1; float b = 2.4; char c = w ; Βρείτε τα λάθη στις παρακάτω δηλώσεις μεταβλητών int 1a; float else; char letter@; // Τα ονόματα μεταβλητών μπορούν να αρχίζουν μόνο με γράμμα // ή κάτω παύλα _ // Μια δεσμευμένη λέξη (keyword) δε μπορεί να είναι όνομα μεταβλητής // Τα ονόματα μεταβλητών δεν πρέπει να περιέχουν // ειδικούς χαρακτήρες αλλλά μόνο γράμματα, αριθμούς και κάτω παύλα Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα, ποια πράξη γίνεται σε κάθε εντολή int a = 2; int b = 6; 1
int c = 7; int r1, r2, r3, r4, r5, r6, r7; r1 = a + b; // πρόσθεση r2 = a b; // αφαίρεση r3 = a * b; // πολλαπλασιασμός r4 = b / a; // ακέραια διαίρεση r5 = c % a; // υπόλοιπο ακέραιας διαίρεσης r6 = ++a; // αύξηση κατά 1 r7 = b; // μείωση κατά 1 printf("%d %d %d %d %d %d %d", r1, r2, r3, r4, r5, r6, r7 ); Αποτέλεσμα: 8 4 12 3 1 3 5 Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα, εξηγήστε κάθε περίπτωση float a, b, c, d; a = 5 / 2; b = (float) 5 / 2; c = (float) (5 / 2); d = 5 / 2.0; printf("%f %f %f %f", a, b, c, d) ; Αποτέλεσμα: 2.0 2.5 2.0 2.5 Στην πρώτη περίπτωση έχουμε ακέραια διαίρεση Στη δεύτερη περίπτωση γίνεται μετατροπή σε float του 5 οπότε διαίρεση είναι πραγματική Στη τρίτη περίπτωση γίνεται πρώτα η ακέραια διαίρεση λόγω των παρενθέσεων οπότε η μετατροπή σε float που ακολουθεί δεν αλλάζει το αποτέλεσμα Στη τέταρτη περίπτωση γίνεται πραγματική διαίρεση γιατί ένας από τους αριθμούς είναι πραγματικός Να υπολογίστε την τιμή της κάθε λογικής έκφρασης αν οι ακέραιες μεταβλητές έχουν τις εξής τιμές: a=3, b=5, c=0, d= 3 a > 1 + b b >= a + 2 c == d d <= a // 3 > 4, FALSE // 5 >= 3 + 2, 5 >= 5, TRUE // 5 == 3, FALSE // 3 <= 3, TRUE 2
c!= a 3 // 0!= 3 3, 0!= 0, FALSE Για την εισαγωγή σε μια στρατιωτική σχολή ένας άρρεν υποψήφιος πρέπει να έχει ύψος μεγαλύτερο ή ίσο με 170 cm και ηλικία μεταξύ 18 και 22 ετών. Γράψετε κομμάτι κώδικα που ελέγχει τα κριτήρια αυτά και να τυπώνει κατάλληλο μήνυμα για κάθε περίπτωση. οι μεταβλητές age, height εκφράζουν την ηλικία και το ύψος αντίστοιχα if (age >= 18 && age <= 22 && height >= 170) printf("πληρείς τα κριτήρια"); else printf("δεν πληρείς τα κριτήρια"); Εξηγήστε τι κάνει το παρακάτω κομμάτι κώδικα. Τι θα εμφανιστεί στην οθόνη αν η μεταβλητή vathmos είναι ίση με 7 και τι αν είναι ίση με 12; switch(vathmos) { case 10: case 9: case 8: printf("αριστα"); break; case 7: case 6: case 5: printf("καλά"); break; case 4: case 3: case 2: case 1: case 0: printf("ελλιπείς"); break; default: printf("λάθος βαθμολογία"); Το παραπάνω πρόγραμμα ελέγχει τη βαθμολογία ενός μαθητή και τυπώνει το κατάλληλο μήνυμα ανάλογα με το βαθμό (μεταβλητή vathmos) τυπώνει άριστα αν είναι μεταξύ 10 8 τυπώνει άριστα αν είναι μεταξύ 7 5 τυπώνει άριστα αν είναι μεταξύ 4 0 τυπώνει άριστα σε κάθε άλλη περίπτωση 3
Ποιες οι βασικές μορφές της εντολής if στη C και ποια σύνταξή τους; Στη C υπάρχουν τρεις βασικές δομές επανάληψης if, if else και if else if else if( συνθήκη ) { if( συνθήκη ) { else { if ( συνθήκη ) { Block of statements; else if( συνθήκη ) { else { Ποιες οι βασικές δομές επανάληψης στη C και ποια σύνταξή τους; Στη C υπάρχουν τρεις βασικές δομές επανάληψης for, while και do while for (αρχική τιμή; συνθήκη; μεταβολή) { while( συνθήκη ) { do { while( συνθήκη ); 4
Να γράψετε κομμάτι κώδικα που αρχικοποιεί με τιμές από το πληκτρολόγιο ένα μονοδιάστατο πίνακα ακεραίων. int source[10]; for (i = 0; i < 10; i++) { scanf("%d", &source[i]); Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα; Αιτιολογήστε την απάντηση σας. int source[8] = {2, 4, 5, 11, 9, 23, 4, 16; for (i = 0; i < 8; i++) { if (source[i] == 9) continue; printf("%d ", source[i]); Αποτέλεσμα: 2 4 5 11 23 4 16 Η εντολή for διασχίζει όλα τα στοιχεία του πίνακα source και τυπώνει κάθε στοιχείο εκτός το 9 γιατί με την εντολή continue η τρέχουσα επανάληψη τερματίζεται Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα; Αιτιολογήστε την απάντηση σας. int i,k; for(i = 1; i <= 5; i++) { for(k = 0; k < i; k++) { printf("*"); printf("\n"); Αποτέλεσμα: 5
* ** *** **** ***** Η εξωτερική επανάληψη τυπώνει 4 γραμμές. Σε κάθε γραμμή η εσωτερική επανάληψη τυπώνει τόσα αστεράκια ανάλογα με τον τρέχον αριθμό γραμμής. Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα; Τι εκφράζει το αποτέλεσμα που κρατά η μεταβλητή mystery; int source[8] = {2, 4, 5, 11, 9, 23, 4, 16; int mystery = 0; for (i = 0; i < 8; i++) { mystery = mystery + source[i]; printf("%d", mystery); Αποτέλεσμα: 74 Το πρόγραμμα διασχίζει όλα τα στοιχεί του πίνακα source και τα προσθέτει στη μεταβλητή mystery. Στο τέλος η μεταβλητή περιέχει το άθροισμα των στοιχείων του πίνακα; Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα; Τι εκφράζει το αποτέλεσμα που κρατά η μεταβλητή mystery; int source[10] = {6, 0, 2, 4, 5, 11, 9, 23, 4, 16; int mystery; mystery = source[0]; for (i = 0; i < 10; i++) { if (source[i] > mystery) mystery = source[i]; printf( "%d ", mystery); Αποτέλεσμα: 23 6
Το πρόγραμμα βρίσκει το μέγιστο από τα στοιχεία του πίνακα. Η μεταβλητή mystery αφού πάρει αρχική τιμή συγκρίνεται με κάθε στοιχεί του πίνακα και αν το στοιχείο είναι μεγαλύτερο ενημερώνεται η mystery με τη νέα τιμή. Έτσι στο τέλος του προγράμματος η mystery περιέχει το μέγιστο Τι θα εκτυπώσει το παρακάτω κομμάτι κώδικα; Τι εκφράζει το αποτέλεσμα που κρατά η μεταβλητή mystery; int source[10] = {3, 5, 11, 4, 7, 18, 7, 5, 9, 8; int i = 0; int mystery = 0; while(i<10) { if(source[i]%2 == 0) mystery++; i++; printf("%d", mystery) Αποτέλεσμα: 3 Το πρόγραμμα διασχίζει όλα τα στοιχεία του πίνακα source και μετρά τα στοιχεία που είναι ζυγοί αριθμοί στη μεταβλητή mystery. Ποιο είναι το πρόβλημα με το παρακάτω κομμάτι κώδικα. Αιτιολογήστε την απάντηση σας int done = 0; int i = 100; do { printf("%d", i); i = i + 2; if (i<50) done = 1; while (done == 0); Το πρόβλημα είναι ότι ο βρόγχος επανάληψης δεν θα τερματιστεί ποτέ. Η επανάληψη τερματίζεται όταν η μεταβλητή ελέγχου done γίνει 1. Αυτό γίνεται όταν το i είναι μικρότερο το 50. Στο πρόγραμμα όμως το i έχει αρχική τιμή 100 και αυξάνεται σε κάθε επανάληψη, με αποτέλεσμα ποτέ να μη γίνει μικρότερο του 50. Σε ένα παιχνίδι οι θέσεις των εχθρών (συντεταγμένες x, y) αποθηκεύονται σε ένα δισδιάστατο πίνακα enemies ενώ η θέση της σφαίρας του παίκτη στις μεταβλητές bulletx και bullety. Εξηγήστε τι 7
κάνει το παρακάτω κομμάτι κώδικα, τι εκφράζει στο παιχνίδι η μεταβλητή mystery και ποια η τελική τιμή της; int enemies[5][2] = { {4,5,{3,2,{4,5,{9,1,{1,7 ; int bulletx, bullety; const enemy_points = 50; int mystery = 0; bulletx = 4; bullety = 5; for (i = 0; i < 5; i++) { if(bulletx==enemies[i][0] && bullety==enemies[i][1]) mystery += enemy_points; printf( "%d", mystery); Αποτέλεσμα: 100 Το πρόγραμμα ελέγχει για κάθε εχθρό αν βρίσκεται στο ίδιο σημείο με την σφαίρα. Όταν αυτό ισχύει ο εχθρός σκοτώνεται και παίκτης κερδίζει τους αντίστοιχους πόντους. Το τρέχων σκόρ αποθηκέυεται στη μεταβλητή mystery. 8