Μετάβαση στο περιεχόμενο

Εισαγωγή στον Προγραμματισμό — Χειμερινό Εξ. 2024-25

Η μεταγραφή προέρχεται από τη φωτογραφία 69B2607B-23F6-46A6-A6EB-7F158403570C.jpg της τυπωμένης εξέτασης.

69B2607B-23F6-46A6-A6EB-7F158403570C.jpg

Πανεπιστήμιο Πατρών, Πολυτεχνική Σχολή Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών & Πληροφορικής

Μάθημα : Εισαγωγή στον Προγραμματισμό Εξεταστική Περίοδος: Χειμερινό Εξ. 2024-25

Ονομ/νυμο: ... Αρ. Μητρώου: ........................... Έτος:

Θέμα 1 (2 Μονάδες)

Α. Δώστε τη δήλωση και τον ορισμό μιας συνάρτησης printReverseInt(), η οποία να εμφανίζει τα ψηφία ενός ακέραιου αριθμού με αντίστροφη σειρά (π.χ. το 2025 ως 5202). Για εμφάνιση στην οθόνη θα χρησιμοποιήσετε μόνο τη συνάρτηση putchar() της βασικής βιβλιοθήκης.

Β. Δώστε τη λεκτική περιγραφή με βάση την οποία δώσατε τον ορισμό της συνάρτησης.

Γ. Δώστε ένα πρόγραμμα που διαβάζει από τη βασική είσοδο έναν ακέραιο και χρησιμοποιεί τη συνάρτηση για να τυπώσει, όπως παραπάνω, τους προηγούμενους 5 ακεραίους του.

Στην απάντηση σας να είναι ευδιάκριτα τα Α, Β, Γ,κλπ. Αυτό ισχύει για όλα τα θέματα.

Θέμα 2 (Με αναδρομικότητα 3 Μονάδες, χωρίς αναδρομικότητα 1,5 Μονάδες)

Α. Δώστε τη δήλωση και τον ορισμό μιας συνάρτησης που υπολογίζει το άθροισμα \(2^2 + 3^2 + 4^2 + ... + n^2\), όπου n ακέραιος αριθμός μεγαλύτερος του 2. Για τον ορισμό της συνάρτησης θα χρησιμοποιήσετε αναδρομικότητα.

Β. Δώστε τη λεκτική περιγραφή με βάση την οποία δώσατε τον ορισμό της συνάρτησης.

Γ. Δώστε ένα πρόγραμμα που τυπώνει το παραπάνω άθροισμα για όλους τους περιττούς αριθμούς από το 2 μέχρι έναν ακέραιο αριθμό που θα δώσει ο χρήστης.

Δ. Δώστε τη λεκτική περιγραφή με βάση την οποία δώσατε το σώμα της main.

Θέμα 3 (3 Μονάδες)

Σας έχει ζητηθεί να αναπτύξετε ένα πρόγραμμα που θα υποστηρίζει τον χρήστη στην επεξεργασία των μέσων ημερήσιων θερμοκρασιών είκοσι (20) ετών. Στα πλαίσια αυτά:

Α. Δώστε τον κώδικα που δεσμεύει χώρο στη μνήμη για την αποθήκευση των μέσων ημερήσιων θερμοκρασιών είκοσι ετών. Θεωρήστε πως όλοι οι μήνες έχουν 31 ημέρες.

Β. Δώστε τη δήλωση και τον ορισμό συνάρτησης που θα επιτρέπει στον χρήστη να εισάγει στο σύστημα τις μέσες ημερ. θερμοκρασίες ενός μήνα. Η συνάρτηση να είναι ανεξάρτητη από γενικές μεταβλητές.

Γ. Δώστε τη δήλωση και τον ορισμό συνάρτησης που θα επιτρέπει στον χρήστη να εισάγει στο σύστημα τις μέσες ημερ. θερμοκρασίες ενός έτους. Η συνάρτηση να είναι ανεξάρτητη από γενικές μεταβλητές.

Δ. Δώστε τη δήλωση και τον ορισμό συνάρτησης που θα επιτρέπει στον χρήστη να εισάγει στο σύστημα τις μέσες ημερ. θερμοκρασίες των 20 ετών. Η συνάρτηση να είναι ανεξάρτητη από γενικές μεταβλητές.

Θέμα 4 (2 Μονάδες)

Οι παρακάτω είναι 3 προτάσεις δήλωσης συναρτήσεων (function prototypes) της βασικής βιβλιοθήκης. 1. char *strcpy(char *dest, const char *src); 2. char *strcat(char *dest, const char *src); 3. int strcmp(const char *str1, const char *str2);

Γράψτε ένα πρόγραμμα που να χρησιμοποιεί τις συναρτήσεις αυτές και να εμφανίζει στην οθόνη το αποτέλεσμα που έχει η κλήση κάθε συνάρτησης μέσα στο πρόγραμμα σας.

Χρησιμοποιήστε στο πρόγραμμα σας και τις παρακάτω 2 συναρτήσεις: int atoi(const char *str); // μετατρέπει αλφαριθμητικό σε ακέραιο char * itoa ( int value, char * str, int base ); // μετατρέπει ακέραιο σε αλφαριθμητικό

Διάρκεια: 2,5 ώρες.

ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Βαθμός
1Α 1Β 1Γ 2Α 2Β 2Γ 2Δ 3Α 3Β 3Γ 3Δ 4 Σύνολο
Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: migrated from previous_exams.md (Antigravity, 2026-10)

Προσοχή

Θέμα 2Γ: η εκφώνηση ζητά τους περιττούς αριθμούς «από το 2». Το πρόγραμμα ξεκινά από το 3 (ο πρώτος περιττός μετά το 2) και εξετάζει μόνο περιττά n ≥ 3. Η διατύπωση της εκφώνησης είναι ασαφής ως προς το αν το 2 συμπεριλαμβάνεται. Θέμα 4: η εκφώνηση ζητά χρήση της βιβλιοθηκικής itoa(). Η λύση χρησιμοποιεί μόνο δική της υλοποίηση (my_itoa) και δεν καλεί την itoa() της βιβλιοθήκης, η οποία δεν ανήκει στο ANSI/ISO C.

Λύσεις — Εισαγωγή στον Προγραμματισμό — Χειμερινό Εξ. 2024-25

Λύσεις που μεταφέρθηκαν από το παλαιό συγκεντρωτικό αρχείο. Είναι αυτόματες προτάσεις (AI) και δεν έχουν ελεγχθεί από τον διδάσκοντα. Το κείμενο των εκφωνήσεων αφαιρέθηκε· οι λύσεις αναφέρονται στα Θέματα 1–4 της φωτογραφίας 69B2607B-23F6-46A6-A6EB-7F158403570C.jpg.

💡 Πλήρης Λύση σε C

Ερώτημα 1.Α: Δήλωση και Ορισμός Συνάρτησης
#include <stdio.h>

/* Δήλωση (Prototype) της συνάρτησης */
void printReverseInt(int n);

/* Ορισμός της συνάρτησης */
void printReverseInt(int n) {
    /* Ειδική περίπτωση για το μηδέν */
    if (n == 0) {
        putchar('0');
        return;
    }

    /* Χειρισμός αρνητικών αριθμών */
    if (n < 0) {
        putchar('-');
        n = -n;
    }

    /* Εξαγωγή και εκτύπωση των ψηφίων από το τέλος προς την αρχή */
    while (n > 0) {
        int digit = n % 10;           /* Τελευταίο ψηφίο */
        putchar('0' + digit);         /* Μετατροπή σε χαρακτήρα ASCII και εκτύπωση */
        n /= 10;                      /* Αφαίρεση του τελευταίου ψηφίου */
    }
}
Ερώτημα 1.Β: Λεκτική Περιγραφή

Η συνάρτηση printReverseInt λειτουργεί ως εξής: 1. Έλεγχος ειδικών περιπτώσεων: Αν ο αριθμός ισούται με 0, εκτυπώνεται απευθείας ο χαρακτήρας '0' μέσω της putchar('0'). Αν είναι αρνητικός, εκτυπώνεται το πρόσημο '-' και μετατρέπεται σε θετικό. 2. Επαναληπτική εξαγωγή ψηφίων: Μέσω ενός βρόχου while (n > 0): - Με τη χρήση της πράξης modulo (n % 10), απομονώνεται το λιγότερο σημαντικό ψηφίο του αριθμού (δηλαδή το τελευταίο). - Το ψηφίο μετατρέπεται στον αντίστοιχο ASCII χαρακτήρα προσθέτοντας τον κωδικό του χαρακτήρα '0' ('0' + digit) και εκτυπώνεται αμέσως στην οθόνη με την putchar(). - Ο αριθμός διαιρείται ακέραια με το 10 (n /= 10), απορρίπτοντας το ψηφίο που μόλις εκτυπώθηκε. 3. Η διαδικασία αυτή εκτυπώνει αυτόματα τα ψηφία με αντίστροφη σειρά χωρίς να απαιτείται πίνακας ή άλλη συνάρτηση I/O.

Ερώτημα 1.Γ: Πλήρες Πρόγραμμα
#include <stdio.h>

void printReverseInt(int n);

int main(void) {
    int num;
    printf("Δώστε έναν ακέραιο αριθμό: ");
    if (scanf("%d", &num) != 1) {
        return 1;
    }

    printf("Οι προηγούμενοι 5 ακέραιοι με αντεστραμμένα ψηφία:\n");
    for (int i = 1; i <= 5; i++) {
        int prev = num - i;
        printf("Αριθμός %d -> ", prev);
        printReverseInt(prev);
        putchar('\n');
    }

    return 0;
}

💡 Πλήρης Λύση σε C

Ερώτημα 2.Α: Δήλωση και Αναδρομικός Ορισμός
#include <stdio.h>

/* Δήλωση (Prototype) της αναδρομικής συνάρτησης */
long long sumSquares(int n);

/* Ορισμός της συνάρτησης */
long long sumSquares(int n) {
    /* Βάση της αναδρομής (Base Case) */
    if (n <= 2) {
        return 2LL * 2LL; /* 2^2 = 4 */
    }
    /* Αναδρομικό βήμα (Recursive Step): n^2 + άθροισμα μέχρι n-1 */
    return ((long long)n * n) + sumSquares(n - 1);
}
Ερώτημα 2.Β: Λεκτική Περιγραφή της Συνάρτησης

Η συνάρτηση sumSquares ορίζεται αναδρομικά βασιζόμενη στη μαθηματική σχέση: $\(S(n) = n^2 + S(n - 1), \quad \text{με } S(2) = 2^2 = 4\)$ 1. Συνθήκη Τερματισμού (Base Case): Όταν η παράμετρος \(n\) φτάσει στο \(2\) (ή μικρότερη), η συνάρτηση δεν εκτελεί άλλη αναδρομική κλήση, αλλά επιστρέφει άμεσα την τιμή \(2^2 = 4\). 2. Αναδρομικό Βήμα (Recursive Step): Για κάθε τιμή \(n > 2\), υπολογίζει το τετράγωνο \(n^2\), καλεί αναδρομικά τον εαυτό της για το όρισμα \(n - 1\), και επιστρέφει το άθροισμα των δύο αποτελεσμάτων.

Ερώτημα 2.Γ: Πλήρες Πρόγραμμα
#include <stdio.h>

long long sumSquares(int n);

int main(void) {
    int maxLimit;

    printf("Εισάγετε ακέραιο όριο (>= 3): ");
    if (scanf("%d", &maxLimit) != 1) {
        return 1;
    }

    if (maxLimit < 3) {
        printf("Το όριο πρέπει να είναι τουλάχιστον 3.\n");
        return 0;
    }

    printf("\nΑποτελέσματα για όλους τους περιττούς αριθμούς στο διάστημα [2, %d]:\n", maxLimit);
    for (int i = 3; i <= maxLimit; i += 2) {
        printf("Για n = %d: Άθροισμα 2^2 + ... + %d^2 = %lld\n", i, i, sumSquares(i));
    }

    return 0;
}
Ερώτημα 2.Δ: Λεκτική Περιγραφή της main

Η συνάρτηση main: 1. Διαβάζει από τον χρήστη μέσω της scanf() το ανώτατο ακέραιο όριο maxLimit. 2. Ελέγχει την εγκυρότητα της εισόδου ώστε να υπάρχει τουλάχιστον ένας περιττός αριθμός μεγαλύτερος του 2 (δηλαδή maxLimit >= 3). 3. Χρησιμοποιεί έναν βρόχο επανάληψης for ξεκινώντας από τον πρώτο περιττό αριθμό \(i = 3\), αυξάνοντας κάθε φορά κατά 2 (\(i \mathrel{+}= 2\)) έως ότου καλυφθεί το δοθέν όριο. 4. Σε κάθε επανάληψη καλεί την αναδρομική συνάρτηση sumSquares(i) και τυπώνει το υπολογισμένο άθροισμα στην οθόνη.


💡 Πλήρης Λύση σε C

Ερώτημα 3.Α: Δέσμευση Χώρου Μνήμης

Ορίζουμε σταθερές για τις διαστάσεις και δεσμεύουμε τρισδιάστατο πίνακα (20 έτη \(\times\) 12 μήνες \(\times\) 31 ημέρες = 7.440 στοιχεία τύπου float):

#define YEARS 20
#define MONTHS 12
#define DAYS 31

/* Στατική δέσμευση τοπικού πίνακα (ή δυναμική δέσμευση) */
float temperatures[YEARS][MONTHS][DAYS];

Ερώτημα 3.Β: Εισαγωγή Θερμοκρασιών Ενός Μήνα
/* Δήλωση */
void inputMonthTemperatures(float monthTemps[DAYS], int monthNum, int yearNum);

/* Ορισμός */
void inputMonthTemperatures(float monthTemps[DAYS], int monthNum, int yearNum) {
    printf("--- Εισαγωγή θερμοκρασιών για Μήνα %d (Έτος %d) ---\n", monthNum + 1, yearNum + 1);
    for (int d = 0; d < DAYS; d++) {
        printf("Ημέρα %2d: ", d + 1);
        scanf("%f", &monthTemps[d]);
    }
}
Ερώτημα 3.Γ: Εισαγωγή Θερμοκρασιών Ενός Έτους
/* Δήλωση */
void inputYearTemperatures(float yearTemps[MONTHS][DAYS], int yearNum);

/* Ορισμός */
void inputYearTemperatures(float yearTemps[MONTHS][DAYS], int yearNum) {
    printf("\n=== Εισαγωγή Δεδομένων Έτους %d ===\n", yearNum + 1);
    for (int m = 0; m < MONTHS; m++) {
        /* Καλεί τη συνάρτηση του μήνα για κάθε έναν από τους 12 μήνες */
        inputMonthTemperatures(yearTemps[m], m, yearNum);
    }
}
Ερώτημα 3.Δ: Εισαγωγή Θερμοκρασιών των 20 Ετών
/* Δήλωση */
void inputAllTemperatures(float allTemps[YEARS][MONTHS][DAYS], int totalYears);

/* Ορισμός */
void inputAllTemperatures(float allTemps[YEARS][MONTHS][DAYS], int totalYears) {
    for (int y = 0; y < totalYears; y++) {
        /* Καλεί τη συνάρτηση του έτους για κάθε έτος */
        inputYearTemperatures(allTemps[y], y);
    }
}

💡 Πλήρης Λύση σε C

(Σημείωση: Επειδή η itoa() δεν ανήκει στο αυστηρό πρότυπο ANSI/ISO C αλλά είναι διαδεδομένη σε POSIX/Windows compilers, συμπεριλαμβάνεται πλήρης portable υλοποίησή της ώστε το πρόγραμμα να μεταγλωττίζεται σε οποιοδήποτε σύστημα).

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Φορητή υλοποίηση της itoa για πλήρη συμβατότητα με ISO C */
char *my_itoa(int value, char *str, int base) {
    if (base < 2 || base > 36) {
        *str = '\0';
        return str;
    }
    char *ptr = str, *ptr1 = str, tmp_char;
    int tmp_value;

    do {
        tmp_value = abs(value % base);
        *ptr++ = "0123456789abcdefghijklmnopqrstuvwxyz"[tmp_value];
        value /= base;
    } while (value);

    if (value < 0 && base == 10) *ptr++ = '-';
    *ptr-- = '\0';

    /* Αντιστροφή της συμβολοσειράς */
    while (ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr-- = *ptr1;
        *ptr1++ = tmp_char;
    }
    return str;
}

int main(void) {
    char source[] = "CEID_Patras";
    char destination[100];
    char text[100];
    char numStr[] = "2025";
    char buffer[50];

    printf("====================================================\n");
    printf("   ΕΠΙΔΕΙΞΗ ΣΥΝΑΡΤΗΣΕΩΝ ΒΑΣΙΚΗΣ ΒΙΒΛΙΟΘΗΚΗΣ C      \n");
    printf("====================================================\n\n");

    /* 1. Χρήση της strcpy() */
    strcpy(destination, source);
    printf("1. strcpy(destination, \"%s\"):\n", source);
    printf("   -> destination = \"%s\"\n\n", destination);

    /* 2. Χρήση της strcat() */
    strcpy(text, "Department of ");
    strcat(text, destination);
    printf("2. strcat(\"Department of \", destination):\n");
    printf("   -> text = \"%s\"\n\n", text);

    /* 3. Χρήση της strcmp() */
    printf("3. strcmp():\n");
    int cmp1 = strcmp("Apple", "Apple");
    int cmp2 = strcmp("Apple", "Banana");
    int cmp3 = strcmp("Banana", "Apple");
    printf("   -> strcmp(\"Apple\", \"Apple\")   = %d (Ίσες συμβολοσειρές)\n", cmp1);
    printf("   -> strcmp(\"Apple\", \"Banana\")  = %d (Η 1η προηγείται λεξικογραφικά)\n", cmp2);
    printf("   -> strcmp(\"Banana\", \"Apple\")  = %d (Η 1η έπεται λεξικογραφικά)\n\n", cmp3);

    /* 4. Χρήση της atoi() */
    int parsedNum = atoi(numStr);
    printf("4. atoi(\"%s\"):\n", numStr);
    printf("   -> Ακέραιος = %d | Αποτέλεσμα πρόσθεσης (parsedNum + 1) = %d\n\n", 
           parsedNum, parsedNum + 1);

    /* 5. Χρήση της itoa() */
    int valToConvert = 1453;
    my_itoa(valToConvert, buffer, 10);
    printf("5. itoa(%d, buffer, 10):\n", valToConvert);
    printf("   -> Συμβολοσειρά = \"%s\"\n", buffer);

    my_itoa(255, buffer, 16);
    printf("   -> itoa(255, buffer, 16) σε δεκαεξαδική βάση = \"%s\"\n", buffer);

    return 0;
}

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή