Άσκηση: Δημιουργία & Συμπίεση JSON

Θεωρία JSON + Πρακτική Άσκηση σε C (2 Μέρη)

📝 Εκφώνηση Άσκησης

🎯 Σκοπός

Ο φοιτητής θα φτιάξει δύο προγράμματα που δουλεύουν με αρχεία JSON:

  • Μέρος Α: Πρόγραμμα που δημιουργεί ένα JSON αρχείο με στοιχεία φοιτητών
  • Μέρος Β: Πρόγραμμα που συμπιέζει (minify) το JSON αρχείο σε μία γραμμή
ΜΕΡΟΣ Α

📌 Πρόγραμμα Εγγραφής — write_json.c

Γράψτε πρόγραμμα που:

  1. Ζητάει από τον χρήστη να εισάγει στοιχεία για 3 φοιτητές:
    • Όνομα (string)
    • Ηλικία (int)
    • Βαθμός (float)
  2. Δημιουργεί αρχείο students.json με την παρακάτω μορφή:
{
  "students": [
    {
      "name": "Giorgos",
      "age": 20,
      "grade": 8.5
    },
    {
      "name": "Maria",
      "age": 21,
      "grade": 9.2
    },
    {
      "name": "Nikos",
      "age": 19,
      "grade": 7.8
    }
  ]
}

📝 Παρατηρήσεις

  • Προσοχή στα κόμματα: μετά από κάθε φοιτητή εκτός από τον τελευταίο
  • Προσοχή στη στοίχιση (indentation) με κενά
  • Τα strings σε JSON μπαίνουν σε διπλά εισαγωγικά "..."
ΜΕΡΟΣ Β

📌 Πρόγραμμα Συμπίεσης — minify.c

Στο πραγματικό διαδίκτυο, τα JSON αρχεία στέλνονται συνήθως σε συμπιεσμένη μορφή (minified) — χωρίς κενά, tabs ή αλλαγές γραμμής. Αυτό εξοικονομεί χώρο και ταχύτητα στο δίκτυο.

Η δουλειά σου: γράψε πρόγραμμα που παίρνει το students.json (από το Μέρος Α) και το μετατρέπει σε minified.json.

📥 Είσοδος (αρχείο students.json)

{
  "students": [
    {
      "name": "Giorgos",
      "age": 20,
      "grade": 8.5
    },
    {
      "name": "Maria",
      "age": 21,
      "grade": 9.2
    },
    {
      "name": "Nikos",
      "age": 19,
      "grade": 7.8
    }
  ]
}

📤 Έξοδος (αρχείο minified.json)

{"students":[{"name":"Giorgos","age":20,"grade":8.5},{"name":"Maria","age":21,"grade":9.2},{"name":"Nikos","age":19,"grade":7.8}]}

📋 Τι πρέπει να κάνει το πρόγραμμα

  1. Ανοίγει το students.json για ανάγνωση
  2. Ανοίγει το minified.json για εγγραφή
  3. Διαβάζει χαρακτήρα-χαρακτήρα με fgetc
  4. Γράφει μόνο τους χαρακτήρες που είναι χρήσιμοι με fputc

🔑 Κανόνες Συμπίεσης

Όταν βρεις... Κάνε αυτό
Κενό ' ' ΠΑΡΑΛΕΙΨΕ τον (εκτός αν είσαι μέσα σε string)
Tab '\t' ΠΑΡΑΛΕΙΨΕ τον
Νέα γραμμή '\n' ΠΑΡΑΛΕΙΨΕ τη
Οποιοσδήποτε άλλος χαρακτήρας Γράψτον στο αρχείο

⚠️ Προσοχή με τα strings!

Αν ο χαρακτήρας είναι μέσα σε εισαγωγικά (π.χ. "Γιώργος Παπαδόπουλος"), τα κενά πρέπει να διατηρηθούν!

💡 Υπόδειξη: Χρησιμοποίησε μια μεταβλητή int inside_string = 0; που γίνεται 1 όταν βλέπεις " και γίνεται ξανά 0 όταν βλέπεις το επόμενο ".

🎯 Σκελετός Προγράμματος

#include <stdio.h> int main() { FILE *in = fopen("students.json", "r"); FILE *out = fopen("minified.json", "w"); /* Έλεγχος NULL για αμφότερα */ int c; int inside_string = 0; while ((c = fgetc(in)) != EOF) { /* Αν βρεις " γύρνα τη σημαία inside_string */ /* Αν είσαι ΜΕΣΑ σε string → γράψε τα πάντα */ /* Αλλιώς → παράλειψε κενά, tabs, newlines */ } fclose(in); fclose(out); printf("Done! Check minified.json\n"); return 0; }

🔗 Σύνδεση με το Μέρος Α

📁 Ροή αρχείων:
students.json (Μέρος Α) → minified.json (Μέρος Β)

✅ Κριτήρια Αξιολόγησης

Κριτήριο Βαθμοί
Σωστό άνοιγμα/κλείσιμο αρχείων με έλεγχο NULL 20%
Μέρος Α — Σωστή δημιουργία JSON (εισαγωγικά, κόμματα, αγκύλες, στοίχιση) 35%
Μέρος Β — Σωστή συμπίεση (minify) με διατήρηση των strings 30%
Καθαρός κώδικας με σχόλια 15%