Σάββατο, 22 Σεπτεμβρίου 2018

Τρεχάτε να κρυφτείτε

Βαθμός Δυσκολίας:
5/5
Εκφώνηση Ασκησης: 

Σε κάποιους αγώνες στίβου συμμετέχουν ένα μεγάλο πλήθος αθλητών, αλλά στους αγώνες 100 μέτρων συμμετείχαν 100 αθλητές. Όλη η διοργάνωση γίνεται προς τιμήν του πρωταθλητή με το παγκόσμιο ρεκόρ στον αγώνα των 100 μέτρων. Για αυτό το λόγο να κατασκευάσετε πρόγραμμα σε ΓΛΩΣΣΑ που:

Α. Να περιλαμβάνει τμήμα δηλώσεων. (2 Μονάδες)

Β.1. Να διαβάζει το παγκόσμιο ρεκόρ και το ρεκόρ αγώνων. Να αποθηκεύει σε έναν πίνακα ΟΝ[100] τα ονόματα των 100 παικτών που θα πάρουν μέρος στον αγώνα και σε έναν πίνακα ΤΙΜΕ[100,3] τους χρόνους που έκαναν στους τρεις προκριματικούς πριν τον τελικό, ελέγχοντας αν είναι θετικοί. (2 Μονάδες)

Β.2. Να βρίσκει ποιοι 10 αθλητές προκρίθηκαν στον τελικό, θεωρώντας ότι στον τελικό προκρίνονται οι 10 αθλητές με τους 10 καλύτερους χρόνους. Να κάνετε όποιες διαδικασίες χρειάζονται ώστε οι 10 αθλητές που προκρίθηκαν να βρίσκονται στις πρώτες δέκα θέσεις του ΟΝ[100] και στις πρώτες δέκα θέσεις του πίνακα ΒΕST_ΤΙΜΕ[100]. (4 Μονάδες)

Για τους 10 που πήγαν στον τελικό:

Γ. Να εξετάζει επαναλαμβανόμενα αν ο καλύτερος χρόνος κάθε παίκτη ξεπερνάει κάποιο από τα ρεκόρ. Αν ξεπερνάει το ρεκόρ αγώνων ή το παγκόσμιο ρεκόρ ή και τα δύο, να εμφανίζει κατάλληλο μήνυμα με το όνομα του αθλητή και τους χρόνους. Θεωρήστε ότι οι αθλητές που ξεπερνάνε τα ρεκόρ μπορούν να είναι το πολύ δύο. (4 Μονάδες)

Δ. Κατά την διάρκεια του τελικού υπάρχει περίπτωση να γίνει εσφαλμένη εκκίνηση από κάποιον αθλητή. Σε αυτή την περίπτωση ο αθλητής δέχεται μια παρατήρηση. Στις 3 παρατηρήσεις αποβάλλεται και την θέση του παίρνει ο ακριβώς επόμενος. Να διαβάζει επαναληπτικά χρόνους εκκίνησης σε πίνακα ΕΚ[10] και για κάθε εσφαλμένη εκκίνηση να καταχωρεί μια παρατήρηση στον συγκεκριμένο παίκτη σε πίνακα Π[10]. Στο τέλος να αποθηκεύει σε έναν καινούριο πίνακα τους χρόνους του τελικού και τα καινούρια ονόματα. Η παραπάνω διεργασία σταματά όταν και οι 10 χρόνοι που θα διαβαστούν είναι δεκτοί. (5 Μονάδες)

Ε. Να ταξινομεί τον πίνακα ανάλογα με τους καλύτερους χρόνους και να εμφανίζει τα ονόματα των τριών νικητών, αναφέροντας πιο βραβείο και ποια θέση κατέλαβε ο καθένας. Σε περίπτωση ισοβαθμίας να εμφανίζει όσα ονόματα χρειαστούν. Ακόμα να εξετάζει ξανά τα ρεκόρ, όπως στο ερώτημα Γ. Θεωρήστε ότι το πολύ δύο αθλητές μπορούν να ισοβαθμούν. (3 Μονάδες)

ΣΗΜΑΝΤΙΚΗ ΣΗΜΕΙΩΣΗ: Καμία από τις γνωστές συναρτήσεις δεν θεωρείται δεδομένη και για αυτό το λόγο μπορείτε να χρησιμοποιήσετε ελεύθερα διαδικασίες και συναρτήσεις.

Επιμέλεια: Αίαντας Σωτηρόπουλος

H άσκηση συμμετέχει στον διαγωνισμό 1 Άσκηση = 1 Tablet.

Βαθμολογία Κριτών

Χρήστος Τσάλης Γιάννης Καψάλης Φανή Αναγνώστου Δημήτρης Τζανέκας Μίλτος Στάμος
8.5 10 9 10 10

 

Συνολική Βαθμολογία Κριτών                47.5

Συνολική Βαθμολογία από τα Likes        8

Συνολική Βαθμολογία                       55.5

 

Λύση Άσκησης: 

ΠΡΟΓΡΑΜΜΑ    ΤΡΕΧΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ : αγ_ρεκ, π_ρεκ, TIME[100,3], min, B_TIME[100],temp_time, EK[10], Π[10] , Ν_ΤΙΜΕ[10], π_ρεκ_ν, αγ_ρεκ_ν
  ΧΑΡΑΚΤΗΡΕΣ : ΟΝ[100], temp_name
  ΑΚΕΡΑΙΕΣ : i, j, w, k, flag
ΑΡΧΗ
  ΔΙΑΒΑΣΕ αγ_ρεκ, π_ρεκ

  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 100
    ΔΙΑΒΑΣΕ  ΟΝ[i]

  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 100
    ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ  3
      ΔΙΑΒΑΣΕ TIME[i,j]
      ΟΣΟ TIME[i,j]<0 ΕΠΑΝΑΛΑΒΕ
        ΓΡΑΨΕ 'Μη αποδεκτός χρόνος. Ξαναδιαβάστε χρόνο.'
        ΔΙΑΒΑΣΕ TIME[i,j]
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  min <-- TIME[1,1]
  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 100
    ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ   3
      ΑΝ min > TIME[i,j] ΤΟΤΕ
        min <-- TIME[i,j]
      ΤΕΛΟΣ_ΑΝ

    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    B_TIME[i] <-- min
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 100
    ΓΙΑ w ΑΠΟ 100 ΜΕΧΡΙ i ΜΕ ΒΗΜΑ -1
      ΑΝ B_TIME[w] > B_TIME[w-1] ΤΟΤΕ
        temp_time <-- B_TIME[w]
        B_TIME[w] <-- B_TIME[w-1]
        B_TIME[w-1] <--  temp_time
        temp_name <-- ΟΝ[w]
        ΟΝ[w] <-- ΟΝ[w-1]
        ΟΝ[w-1] <-- temp_name
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  π_ρεκ_ν <-- 0
  αγ_ρεκ_ν <-- 0


  ΑΝ B_TIME[1] > π_ρεκ ΤΟΤΕ
    π_ρεκ_ν <-- B_TIME[1]
    ΑΝ      B_TIME[1] = B_TIME[2]   ΤΟΤΕ
      ΓΡΑΨΕ  'Το νεο ρεκόρ αγώνων, αλλά και παγκόσμιο ρεκόρ είναι', π_ρεκ_ν,'και το κατέρριψαν οι', ΟΝ[1], ΟΝ[2]
    ΑΛΛΙΩΣ
      ΓΡΑΨΕ 'Το νεο ρεκόρ αγώνων, αλλά και παγκόσμιο ρεκόρ είναι', π_ρεκ_ν,'και το κατέρριψε ο', ΟΝ[1]
    ΤΕΛΟΣ_ΑΝ
  ΑΛΛΙΩΣ_ΑΝ B_TIME[1] > αγ_ρεκ ΤΟΤΕ
    αγ_ρεκ_ν <-- B_TIME[1]
    ΑΝ      B_TIME[1] = B_TIME[2]   ΤΟΤΕ
      ΓΡΑΨΕ 'Το νεο ρεκόρ αγώνων', αγ_ρεκ_ν,'και το κατέρριψαν οι', ΟΝ[1], ΟΝ[2]
    ΑΛΛΙΩΣ
      ΓΡΑΨΕ 'Το νεο ρεκόρ αγώνων', αγ_ρεκ_ν,'και το κατέρριψε ο', ΟΝ[1]
    ΤΕΛΟΣ_ΑΝ
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'Δεν καταρίφηκε κανένα ρεκόρ.'
  ΤΕΛΟΣ_ΑΝ

  k <-- 1

  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    flag <-- 0
    ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
      ΔΙΑΒΑΣΕ EK[i]
      Π[i] <-- 0
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
      ΑΝ EK[i]<0 ΤΟΤΕ
        flag <-- 1
        Π[i] <-- Π[i] + 1
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
      ΑΝ Π[i]=3 ΤΟΤΕ
        temp_name <-- ΟΝ[i]
        ΟΝ[i] <-- ΟΝ[k]
        ΟΝ[k] <-- temp_name
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

    k <-- k+1

  ΜΕΧΡΙΣ_ΟΤΟΥ  flag=0


  ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
    ΔΙΑΒΑΣΕ Ν_ΤΙΜΕ[i]
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 10
    ΓΙΑ w ΑΠΟ 10 ΜΕΧΡΙ i ΜΕ ΒΗΜΑ -1
      ΑΝ Ν_ΤΙΜΕ[w] > Ν_ΤΙΜΕ[w-1] ΤΟΤΕ
        temp_time <-- Ν_ΤΙΜΕ[w]
        Ν_ΤΙΜΕ[w] <-- Ν_ΤΙΜΕ[w-1]
        Ν_ΤΙΜΕ[w-1] <--  temp_time
        temp_name <-- ΟΝ[w]
        ΟΝ[w] <-- ΟΝ[w-1]
        ΟΝ[w-1] <-- temp_name
      ΤΕΛΟΣ_ΑΝ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

  ΑΝ  Ν_ΤΙΜΕ[1]=Ν_ΤΙΜΕ[2] ΤΟΤΕ
    ΓΡΑΨΕ 'Στην πρώτη θέση με χρυσό μετάλλιο o', ΟΝ[1],' και ο', ΟΝ[2]
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'Στην πρώτη θέση με χρυσό μετάλλιο o', ΟΝ[1]
  ΤΕΛΟΣ_ΑΝ

  ΑΝ  Ν_ΤΙΜΕ[2]=Ν_ΤΙΜΕ[3] ΤΟΤΕ
    ΓΡΑΨΕ 'Στην δεύτερη θέση με αργυρό μετάλλιο o', ΟΝ[2],' και ο', ΟΝ[3]
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'Στην δεύτερη θέση με αργυρό μετάλλιο o', ΟΝ[2]
  ΤΕΛΟΣ_ΑΝ

  ΑΝ  Ν_ΤΙΜΕ[3]=Ν_ΤΙΜΕ[4] ΤΟΤΕ
    ΓΡΑΨΕ 'Στην τρίτη θέση με χάλκινο μετάλλιο o', ΟΝ[3],' και ο', ΟΝ[4]
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'Στην τρίτη θέση με χάλκινο μετάλλιο o', ΟΝ[3]
  ΤΕΛΟΣ_ΑΝ

  ΑΝ αγ_ρεκ_ν<>0 Ή π_ρεκ<>0 ΤΟΤΕ
    ΑΝ Ν_ΤΙΜΕ[1] > π_ρεκ ΤΟΤΕ
      π_ρεκ_ν <-- Ν_ΤΙΜΕ[1]
      ΑΝ  Ν_ΤΙΜΕ[1]=Ν_ΤΙΜΕ[2] ΤΟΤΕ
        ΓΡΑΨΕ  'Το τελικό ρεκόρ αγώνων, αλλά και παγκόσμιο ρεκόρ είναι', π_ρεκ_ν,'και το κατέρριψαν οι', ΟΝ[1], ΟΝ[2]
      ΑΛΛΙΩΣ
        ΓΡΑΨΕ  'Το τελικό ρεκόρ αγώνων, αλλά και παγκόσμιο ρεκόρ είναι', π_ρεκ_ν,'και το κατέρριψε ο', ΟΝ[1]
      ΤΕΛΟΣ_ΑΝ
    ΑΛΛΙΩΣ_ΑΝ Ν_ΤΙΜΕ[1] > αγ_ρεκ ΤΟΤΕ
      αγ_ρεκ_ν <-- Ν_ΤΙΜΕ[1]
      ΑΝ  Ν_ΤΙΜΕ[1]=Ν_ΤΙΜΕ[2] ΤΟΤΕ
        ΓΡΑΨΕ 'Το τελικό ρεκόρ αγώνων', αγ_ρεκ_ν,'και το κατέρριψαν οι', ΟΝ[1], ΟΝ[2]
      ΑΛΛΙΩΣ
        ΓΡΑΨΕ  'Το τελικό ρεκόρ αγώνων', αγ_ρεκ_ν,'και το κατέρριψε ο', ΟΝ[1]
      ΤΕΛΟΣ_ΑΝ
    ΑΛΛΙΩΣ
      ΓΡΑΨΕ 'Δεν καταρίφηκε κανένα ρεκόρ.'
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΑΝ

ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ