leomaster

EPY Dekathlon - 2004 Phase A, refactor of https://pastebin.com/4v5BbnmE

Oct 26th, 2020 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.80 KB | None | 0 0
  1. /*
  2.  
  3. 17ος Πανελλήνιος Διαγωνισμός Πληροφορικής
  4. (Σχολικό Έτος 2004-5)
  5.  
  6. Θέμα Α' Φάσης: Δέκαθλο
  7. Ένα από τα πλέον όμορφα και ταυτόχρονα δυναμικά Ολυμπιακά Αγωνίσματα είναι το Δέκαθλο. Οι δεκαθλητές, δοκιμάζονται κυριολεκτικά σε δέκα αγωνίσματα στίβου. Στους Ολυμπιακούς Αγώνες της Αθήνας οι δεκαθλητές αγωνίστηκαν σε αυτά τα αγωνίσματα, στις 23 & 24 Αυγούστου 2004. Η τελική κατάταξη προέκυψε από το άθροισμα των βαθμών που συγκέντρωσαν οι αθλητές σε κάθε αγώνισμα. Για λόγους καθαρά στατιστικής, σε κάθε αγώνισμα βγήκε ένας «νικητής» αγωνίσματος. Στο άλμα επί κοντώ, ο νικητής προκύπτει από τους αθλητές που υπερπήδησαν το ίδιο ύψος με μικρότερο αριθμό συνολικών προσπαθειών. Αθλητές με ίδιο αριθμό προσπαθειών που υπερπήδησαν το ίδιο ύψος ανακηρύσσονται εξ ίσου νικητές.
  8.  
  9. Να γραφεί πρόγραμμα το οποίο θα δέχεται για είσοδο αρχείο εισόδου txt με τον αριθμό των αξιολογούμενων αθλητών, με βάση τη σειρά συμμετοχής στο άθλημα και για κάθε αθλητή, περιέχει το τελικό ύψος υπερπήδησης και τον αριθμό των συνολικών προσπαθειών. Το πρόγραμμα θα επιστρέφει σε αρχείο εξόδου txt τον αριθμό των νικητών του αγωνίσματος και τη σειρά συμμετοχής, που αυτός / αυτοί είχε / είχαν.
  10.  
  11. ΕΙΣΟΔΟΣ
  12. Το αρχείο εισόδου θα έχει το όνομα dekathlo.txt και την παρακάτω δομή: Η πρώτη γραμμή θα έχει ένα ακέραιο αριθμό Ν που θα δίνει τον αριθμό των αθλητών που συμμετείχαν. Οι επόμενες Ν γραμμές, θα περιέχουν από δύο ΥΝ, ΠΝ ακέραιους αριθμούς χωριζόμενους από ένα κενό. Ο πρώτος ακέραιος κάθε γραμμής αντιστοιχεί στο ύψος σε εκατοστά που υπερπήδησε κάθε αθλητής και ο δεύτερος ακέραιος στον αριθμό των προσπαθειών του. Η σειρά που περιέχονται οι αριθμοί στο αρχείο, είναι η σειρά συμμετοχής τους στο αγώνισμα.
  13.  
  14. ΕΞΟΔΟΣ
  15. Το αρχείο εξόδου θα έχει το όνομα nikites.txt και την παρακάτω δομή. Η πρώτη γραμμή περιέχει έναν ακέραιο Χ που θα δίνει το πλήθος των νικητών του αγωνίσματος. Οι επόμενες Χ γραμμές θα περιέχουν από έναν ακέραιο Ι (0 ≤ Χ ≤ Ν) που θα αντιστοιχεί στη σειρά συμμετοχής του κάθε νικητή.
  16.  
  17. ΠΑΡΑΔΕΙΓΜΑΤΑ:
  18. dekathlo.txt
  19. 10
  20. 590 9
  21. 595 12
  22. 585 6
  23. 575 9
  24. 595 9
  25. 590 12
  26. 585 6
  27. 590 12
  28. 585 9
  29. 0 3
  30.  
  31. nikites.txt
  32. 1
  33. 5
  34.  
  35. -
  36.  
  37. dekathlo.txt   
  38. 8
  39. 570 9
  40. 0 3
  41. 585 6
  42. 575 9
  43. 575 9
  44. 585 6
  45. 570 12
  46. 585 9
  47.  
  48. nikites.txt
  49. 2
  50. 3
  51. 6
  52.  
  53. Περιορισμοί:
  54. 1 < Ν ≤ 128, 400 ≤ ΥΝ ≤ 650 (0: οι άκυρες), 3 ≤ ΠΝ ≤ 30
  55.  
  56. */
  57.  
  58. #include <stdio.h>
  59.  
  60. #ifndef DEKATHLO
  61. #define DEKATHLO
  62.  
  63. #define ZERO 0
  64. #define READ "r"
  65. #define WRITE "w"
  66.  
  67. #define NUMBER "%hhu"
  68. #define NUMBERS "%hu %hu"
  69. #define NUMBER_LF "%hhu\n"
  70.  
  71. #define IN "dekathlo.txt"
  72. #define OUT "nikites.txt"
  73.  
  74. #define ATHLETES_LIMIT 0x80
  75. #endif
  76.  
  77. FILE *fd;
  78.  
  79. unsigned char id, athletes, winners[-~ATHLETES_LIMIT];
  80. unsigned short top, gun, min, max;
  81.  
  82. int main ( int argc , char *argv[] ) {
  83.  
  84.     for ( fscanf ( fd = fopen ( IN , READ ) , NUMBER , &athletes ) ; id++ < athletes ; )
  85.         fscanf ( fd , NUMBERS , &top , &gun ),
  86.         (( max < top ) || (( max == top ) && ( min > gun ))) && (( *winners = ZERO ) , ( max = top ) , ( min = gun )),
  87.         (( max ^ top ) || ( min ^ gun )) || ( winners [ ++*winners ] = id );
  88.     fclose ( fd );
  89.  
  90.     for ( fprintf ( fd = fopen ( OUT , WRITE ) , NUMBER_LF , *winners ), id = ZERO ; id++ < *winners ; )
  91.         fprintf ( fd , NUMBER_LF , winners [ id ] );
  92.     fclose ( fd );
  93.  
  94.     return ZERO;
  95.  
  96. }
  97.  
Add Comment
Please, Sign In to add comment