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

Εισαγωγή στον Προγραμματισμό — Σεπτέμβριος 2024 (Επαναληπτική)

Η μεταγραφή προέρχεται από το αρχείο THEMATA_C_SEP_2024.pdf (κείμενο του PDF, 2 σελίδες).

THEMATA_C_SEP_2024.pdf

Εισαγωγή στον Προγραμματισμό Επαναληπτική Εξέταση Σεπτεμβρίου 2024 ΔΙΑΡΚΕΙΑ : 2,5 ΩΡΕΣ

Σημειώστε την επιλογή σας: Θέματα 1 και 2 (10 Μονάδες): ... Θέματα: 1Α, 2Α, 2Β και 3 (7 Μονάδες): ...

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

A) [1.5 Μονάδες] Γράψτε ένα πρόγραμμα σε C σύμφωνα με το οποίο το σύστημα θα διαβάζει ένα αλφαριθμητικό από την βασική είσοδο και θα εκτυπώνει για κάθε χαρακτήρα του το πόσες φορές αυτός εμφανίζεται στο αλφαριθμητικό.

B) [1.5 Μονάδες] Δώστε μια άλλη εκδοχή του παραπάνω προγράμματος ορίζοντας και αξιοποιώντας μια συνάρτηση η οποία θα δέχεται ως όρισμα ένα αλφαριθμητικό και επιστρέφει το πόσες φορές εμφανίζεται στο αλφαριθμητικό ο κάθε χαρακτήρας του.

Γ) [1 Μονάδα] Περιγράψτε με δικά σας λόγια πως επικοινωνεί η main με την παραπάνω συνάρτηση.

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

Μια αίθουσα διδασκαλίας έχει τα καθίσματα της διατεταγμένα σε 3 γραμμές και 5 στήλες.

Α) [3 Μονάδες] Γράψτε ένα πρόγραμμα σε C σύμφωνα με το οποίο το σύστημα θα εκτελεί τις παρακάτω λειτουργίες:

[Καταχώρηση] Θα διαβάζει, για κάθε φοιτητή που βρίσκεται στην αίθουσα, το ονοματεπώνυμο και τον αριθμό μητρώου καθώς και την θέση του και θα τα αποθηκεύει στη μνήμη.

[Εμφάνιση] Θα εμφανίζει στην οθόνη την παραπάνω πληροφορία.

[Αναζήτηση] Θα διαβάζει ονοματεπώνυμο και αριθμό μητρώου και θα ψάχνει να δει αν ο φοιτητής είναι στην αίθουσα, οπότε θα εμφανίζει την γραμμή και στήλη στην οποία κάθεται αυτός.

B) [1 Μονάδα] Δώστε τη λεκτική περιγραφή με βάση την οποία δομήσατε τη main του προγράμματός σας.

Γ) [2 Μονάδες] Δώστε τη δήλωση και τον ορισμό μιας συνάρτησης που θα δέχεται ως όρισμα την πληροφορία που έχει καταχωρηθεί από την λειτουργία της Καταχώρησης και να ενημερώνει την συνάρτηση που την καλεί για την θέση στην οποία κάθεται ο φοιτητής. Δώστε μια νέα έκδοση του προγράμματος η οποία αξιοποιεί την συνάρτηση που ορίσατε. Δώστε μόνο τον κώδικα του προγράμματος που αλλάζει με την χρήση της συνάρτησης.

Θέμα 3 (Το θέμα αυτό μπορείτε να το επιλέξετε αντί των 1Β, 1Γ και 2Γ)

[1.5 Μονάδες] Δώστε τη δήλωση και τον ορισμό μιας συνάρτησης που θα υπολογίζει και επιστρέφει τον μέσο όρο ενός πίνακα ακεραίων. Γράψτε ένα πρόγραμμα που επιδεικνύει τη χρήση της συνάρτησης αυτής.

Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, deepseek-flash), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο

Προσοχή

Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.

AI λύσεις — 2024-09

Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.

Θέμα 1Α

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Υποθέτω ότι εκτυπώνεται το πλήθος για κάθε θέση του αλφαριθμητικού· αν ζητείται μία φορά ανά διαφορετικό χαρακτήρα, αρκεί να προστεθεί πίνακας printed.

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

#define MAX 1000

int main(void) {
    char s[MAX];
    int freq[256] = {0};
    int i;

    printf("Δώσε αλφαριθμητικό: ");
    if (fgets(s, sizeof(s), stdin) == NULL)
        return 1;
    s[strcspn(s, "\n")] = '\0';

    for (i = 0; s[i] != '\0'; i++)
        freq[(unsigned char)s[i]]++;

    for (i = 0; s[i] != '\0'; i++)
        printf("Ο χαρακτήρας '%c' εμφανίζεται %d φορές.\n",
               s[i], freq[(unsigned char)s[i]]);

    return 0;
}

Θέμα 1Β

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Στη C μια συνάρτηση δεν μπορεί να επιστρέψει ολόκληρο πίνακα με τιμή· έτσι χρησιμοποιείται πίνακας-έξοδος freq που περνά στη συνάρτηση με διεύθυνση.

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

#define MAX 1000
#define SYMS 256

void count_chars(const char s[], int freq[SYMS]) {
    int i;

    for (i = 0; i < SYMS; i++)
        freq[i] = 0;

    for (i = 0; s[i] != '\0'; i++)
        freq[(unsigned char)s[i]]++;
}

int main(void) {
    char s[MAX];
    int freq[SYMS];
    int i;

    printf("Δώσε αλφαριθμητικό: ");
    if (fgets(s, sizeof(s), stdin) == NULL)
        return 1;
    s[strcspn(s, "\n")] = '\0';

    count_chars(s, freq);

    for (i = 0; s[i] != '\0'; i++)
        printf("Ο χαρακτήρας '%c' εμφανίζεται %d φορές.\n",
               s[i], freq[(unsigned char)s[i]]);

    return 0;
}

Θέμα 1Γ

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Η main δηλώνει το αλφαριθμητικό s και τον πίνακα συχνοτήτων freq. Καλεί την count_chars(s, freq): το s περνά ως δείκτης σταθερών χαρακτήρων, δηλαδή ως είσοδος, ενώ το freq περνά ως δείκτης σε ακέραιους, δηλαδή ως έξοδος. Επειδή οι πίνακες στη C περνούν με διεύθυνση, η συνάρτηση αρχικοποιεί και αυξάνει τα στοιχεία του freq και οι αλλαγές είναι ορατές στη main. Η συνάρτηση δεν επιστρέφει τιμή· η πληροφορία “επιστρέφει” μέσω του πίνακα freq.

Θέμα 2Α

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

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

#define ROWS 3
#define COLS 5
#define NAME_LEN 50
#define AM_LEN 20

typedef struct {
    int occupied;
    char name[NAME_LEN];
    char am[AM_LEN];
} Seat;

int main(void) {
    Seat room[ROWS][COLS];
    int i, j, n, r, c;

    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            room[i][j].occupied = 0;
            room[i][j].name[0] = '\0';
            room[i][j].am[0] = '\0';
        }
    }

    printf("Πλήθος φοιτητών προς καταχώρηση: ");
    scanf("%d", &n);

    if (n < 0 || n > ROWS * COLS) {
        printf("Λάθος πλήθος φοιτητών.\n");
        return 1;
    }

    for (i = 0; i < n; i++) {
        char name[NAME_LEN], am[AM_LEN];

        printf("Στοιχεία φοιτητή %d: ονοματεπώνυμο σε μια γραμμή, ΑΜ, γραμμή(1-3), στήλη(1-5):\n", i + 1);
        scanf(" %49[^\n]", name);
        scanf("%19s %d %d", am, &r, &c);

        if (r < 1 || r > ROWS || c < 1 || c > COLS || room[r - 1][c - 1].occupied) {
            printf("Η θέση είναι άκυρη ή ήδη κατειλημμένη. Επανάληψη.\n");
            i--;
            continue;
        }

        room[r - 1][c - 1].occupied = 1;
        strcpy(room[r - 1][c - 1].name, name);
        strcpy(room[r - 1][c - 1].am, am);
    }

    printf("\n--- Καταχωρημένοι φοιτητές ---\n");
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (room[i][j].occupied) {
                printf("Θέση (%d,%d): %s, ΑΜ %s\n",
                       i + 1, j + 1, room[i][j].name, room[i][j].am);
            }
        }
    }

    {
        char searchName[NAME_LEN], searchAM[AM_LEN];
        int found = 0;

        printf("\n--- Αναζήτηση ---\n");
        printf("Ονοματεπώνυμο: ");
        scanf(" %49[^\n]", searchName);
        printf("ΑΜ: ");
        scanf("%19s", searchAM);

        for (i = 0; i < ROWS && !found; i++) {
            for (j = 0; j < COLS; j++) {
                if (room[i][j].occupied &&
                    strcmp(room[i][j].name, searchName) == 0 &&
                    strcmp(room[i][j].am, searchAM) == 0) {
                    printf("Ο φοιτητής %s με ΑΜ %s κάθεται στη γραμμή %d, στήλη %d.\n",
                           searchName, searchAM, i + 1, j + 1);
                    found = 1;
                    break;
                }
            }
        }

        if (!found)
            printf("Ο φοιτητής δεν βρίσκεται στην αίθουσα.\n");
    }

    return 0;
}

Θέμα 2Β

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Η main οργανώθηκε ως εξής:

  1. Δηλώνει έναν δισδιάστατο πίνακα room[3][5] από εγγραφές Seat, όπου κάθε θέση περιέχει occupied, ονοματεπώνυμο και ΑΜ.
  2. Αρχικοποιεί όλες τις θέσεις ως κενές.
  3. Διαβάζει το πλήθος n των φοιτητών που θα καταχωρηθούν.
  4. Για κάθε φοιτητή διαβάζει ονοματεπώνυμο, ΑΜ, γραμμή και στήλη. Ελέγχει αν η θέση είναι έγκυρη και κενή· αν είναι, αποθηκεύει τα στοιχεία και σημειώνει τη θέση ως κατειλημμένη.
  5. Διατρέχει όλο τον πίνακα room και εκτυπώνει όσες θέσεις είναι κατειλημμένες.
  6. Διαβάζει ονοματεπώνυμο και ΑΜ προς αναζήτηση.
  7. Διατρέχει τον πίνακα και, αν βρει φοιτητή με ίδιο ονοματεπώνυμο και ίδιο ΑΜ, τυπώνει τη γραμμή και τη στήλη του· αλλιώς τυπώνει μήνυμα ότι δεν βρίσκεται.
  8. Τερματίζει.

Θέμα 2Γ

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Δήλωση της συνάρτησης, μετά τον ορισμό του typedef:

int find_student(Seat room[ROWS][COLS],
                 const char name[],
                 const char am[],
                 int *row,
                 int *col);

Ορισμός:

int find_student(Seat room[ROWS][COLS],
                 const char name[],
                 const char am[],
                 int *row,
                 int *col) {
    int i, j;

    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (room[i][j].occupied &&
                strcmp(room[i][j].name, name) == 0 &&
                strcmp(room[i][j].am, am) == 0) {
                *row = i + 1;
                *col = j + 1;
                return 1;
            }
        }
    }

    *row = 0;
    *col = 0;
    return 0;
}

Στη main αλλάζει μόνο το τμήμα της αναζήτησης· αφαιρείται η μεταβλητή found και οι εμφωλευμένοι βρόχοι αναζήτησης:

{
    char searchName[NAME_LEN], searchAM[AM_LEN];
    int row, col;

    printf("\n--- Αναζήτηση ---\n");
    printf("Ονοματεπώνυμο: ");
    scanf(" %49[^\n]", searchName);
    printf("ΑΜ: ");
    scanf("%19s", searchAM);

    if (find_student(room, searchName, searchAM, &row, &col))
        printf("Ο φοιτητής %s με ΑΜ %s κάθεται στη γραμμή %d, στήλη %d.\n",
               searchName, searchAM, row, col);
    else
        printf("Ο φοιτητής δεν βρίσκεται στην αίθουσα.\n");
}

Θέμα 3

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Δήλωση:

double average(const int a[], int n);

Ορισμός:

double average(const int a[], int n) {
    long sum = 0;
    int i;

    if (n <= 0)
        return 0.0;

    for (i = 0; i < n; i++)
        sum += a[i];

    return (double)sum / n;
}

Πρόγραμμα επίδειξης:

```c

include

define MAXN 100

double average(const int a[], int n);

double average(const int a[], int n) { long sum = 0; int i;

if (n <= 0)
    return 0.0;

for (i = 0; i < n; i++)
    sum += a[i];

return (double)sum / n;

}

int main(void) { int a[MAXN]; int n, i;

printf("Πλήθος στοιχείων: ");
scanf("%d", &n);

if (n < 0 || n > MAXN) {
    printf("Λάθος πλήθος στοιχείων.\n");
    return 1;
}

printf("Δώσε %d ακεραίους:\n", n);
for (i = 0; i < n; i++)
    scanf("%d", &a[i]);

printf("Μέσος όρος: %.2f\n", average(a, n));

return 0;

}

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


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