fork download
  1. #include <stdio.h>
  2. #include <string.h> /* για memset() */
  3. #include <stdlib.h> /* για exit(), calloc(), free(), κλπ */
  4. #include <time.h> /* για time() */
  5.  
  6. #define MAXINBUF (254+1) /* μέγιστο μήκος γραμμής εισόδου */
  7.  
  8. #define TABLE_BUF_MINLEN 5 /* ελάχιστο πλήθος στοιχείων */
  9. #define TABLE_BUF_EMPTYCELL (-1) /* για μαρκάρισμα κενών στοιχείων */
  10.  
  11. typedef enum { FALSE=0, TRUE } Bool; /* δικός μας πρόσθετος τύπος boolean */
  12.  
  13. typedef struct table { /* η βασική δομή του προγράμματος */
  14. int bufmaxlen; /* ... μέγιστο πλήθος στοιχείων */
  15. int buflen; /* ... τρέχον πλήθος στοιχείων */
  16. int bufsize; /* ... μέγεθος στη μνήμη (σε bytes) */
  17. int *buffer; /* ... ο πίνακας με τα στοιχεία */
  18. } Table;
  19.  
  20. /* --------------------------------------------------------------------------------
  21.  * Αρχικοποιεί την δομή table με default τιμές βάσει του ορίσματος maxlen και
  22.  * δημιουργεί το buffer της στη μνήμη.
  23.  * Επιστρέφει FALSE σε περίπτωση που αποτύχει η δημιουργία του buffer ή αν το όρισμα
  24.  * table περαστεί στη συνάρτηση με τιμή NULL, αλλιώς επιστρέφει TRUE.
  25.  * --------------------------------------------------------------------------------
  26.  */
  27. Bool table_init( Table *table, const int maxlen )
  28. {
  29. if ( !table ) /* έλεγχος ασφαλείας */
  30. return FALSE; /* ... πρόωρη έξοδος */
  31.  
  32. /* μέγιστο πλήθος στοιχείων */
  33. table->bufmaxlen = maxlen < TABLE_BUF_MINLEN ? TABLE_BUF_MINLEN : maxlen;
  34. table->buflen = 0; /* τρέχον πλήθος στοιχείων */
  35. table->bufsize = table->bufmaxlen * sizeof(int);/* μεγέθος στη μνήμη σε bytes */
  36.  
  37. table->buffer = malloc( table->bufsize ); /* δέσμευση μνήμης για buffer */
  38. if ( !table->buffer ) { /* αποτυχία δέσμευσης μνήμης */
  39. table->bufsize = 0; /* ... μηδενισμός μεγέθους */
  40. return FALSE; /* ... επιστροφή αποτυχίας */
  41. }
  42. /* γέμισμα του buffer με TABLE_BUF_EMPTYCELL */
  43. memset( table->buffer, TABLE_BUF_EMPTYCELL, table->bufsize );
  44.  
  45. return TRUE; /* επιστροφή επιτυχίας */
  46. }
  47. /* --------------------------------------------------------------------------------
  48.  * Μηδενίζει τα πεδία της δομής table, αποδεσμεύοντας και τη μνήμη του buffer.
  49.  * Επιστρέφει FALSE αν το όρισμα table περαστεί στη συνάρτηση με τιμή NULL, αλλιώς
  50.  * επιστρέφει TRUE.
  51.  * --------------------------------------------------------------------------------
  52.  */
  53. Bool table_cleanup( Table *table )
  54. {
  55. if ( !table ) /* έλεγχος ασφαλείας */
  56. return FALSE; /* ... πρόωρη έξοδος */
  57.  
  58. if ( table->buffer ) { /* το buffer δεν είναι NULL */
  59. free( table->buffer ); /* ... αποδέσμευση της μνήμης */
  60. table->buffer = NULL; /* ... μηδενισμός του δείκτη */
  61. }
  62. /* μηδενισμός και των υπόλοιπων*/
  63. table->bufmaxlen = table->buflen = table->bufsize = 0;
  64.  
  65. return TRUE;
  66. }
  67. /* --------------------------------------------------------------------------------
  68.  * Γεμίζει το buffer της δομής table με ψευδοτυχαίες τιμές από 0 έως maxval (από το
  69.  * πρώτο κενό στοιχείο έως το τέλος).
  70.  * Σε περίπτωση επιτυχίας ενημερώνει το τρέχον μήκος του buffer στη δομή κι επιστρέφει
  71.  * TRUE. FALSE επιστρέφει όταν το buffer είναι ήδη γεμάτο ή δεν υπάρχει καν ή όταν το
  72.  * όρισμα table περαστεί στη συνάρτηση με τιμή NULL.
  73.  * --------------------------------------------------------------------------------
  74.  */
  75. Bool table_fill_randomly( Table *table, const int maxval )
  76. {
  77. /* ********************************************************************
  78. * γράψτε εδώ τον κώδικα της συνάρτησης, σύμφωνα με τα παραπάνω σχόλια!
  79. */
  80.  
  81. return TRUE;
  82. }
  83. /* --------------------------------------------------------------------------------
  84.  * Τυπώνει στατιστικά σχετικά με το buffer της δομής table: μέγιστη χωρητικότητα σε
  85.  * στοιχεία, πλήθος γεμάτων στοιχείων και μέγεθος που καταλαμβάνει σε bytes το buffer
  86.  * στη μνήμη.
  87.  * Επιστρέφει FALSE αν το όρισμα table περαστεί στη συνάρτηση με τιμή NULL, αλλιώς
  88.  * επιστρέφει TRUE.
  89.  * --------------------------------------------------------------------------------
  90.  */
  91. Bool table_print_info( Table table )
  92. {
  93. if ( !table.buffer ) { /* έλεγχος ασφαλείας */
  94. puts("Δεν βρέθηκε δημιουργημένος πίνακας!\n");
  95. return FALSE; /* ... πρόωρη έξοδος */
  96. }
  97.  
  98. printf("\n\tΜέγιστη χωρητικότητα:\t\t%d στοιχεία\n", table.bufmaxlen );
  99. printf("\tΠλήθος γεμάτων στοιχείων:\t%d\n", table.buflen );
  100. printf("\tΜέγεθος πίνακα στη μνήμη:\t%d bytes\n", table.bufsize );
  101. putchar('\n');
  102.  
  103. return TRUE;
  104. }
  105. /* --------------------------------------------------------------------------------
  106.  * Τυπώνει τα μη κενά στοιχεία του buffer της δομής table.
  107.  * Επιστρέφει FALSE αν δεν υπάρχει δημιουργημένο buffer, αλλιώς επιστρέφει TRUE.
  108.  * --------------------------------------------------------------------------------
  109.  */
  110. Bool table_print_buffer( Table table )
  111. {
  112. register int i = 0;
  113.  
  114. if ( !table.buffer ) { /* έλεγχος ασφαλείας */
  115. puts("Δεν βρέθηκε δημιουργημένος πίνακας!\n");
  116. return FALSE; /* ... πρόωρη έξοδος */
  117. }
  118.  
  119. for (i=0; i < table.buflen; i++) /* τύπωμα των στοιχείων */
  120. printf("%d ", table.buffer[i] );
  121. putchar('\n');
  122.  
  123. return TRUE;
  124. }
  125. /* --------------------------------------------------------------------------------
  126.  * Διαβάζει από την κύρια είσοδο το μέγιστο πλήθος στοιχείων και το επιστρέφει
  127.  * (απαιτεί το μέγιστο πλήθος να είναι μεγαλύτερο ή ίσο του TABLE_BUF_MINLEN).
  128.  * --------------------------------------------------------------------------------
  129.  */
  130. int askuser_maxlen( void )
  131. {
  132. char inbuf[ MAXINBUF ] = {'\0'}; /* δική μας γραμμή κύριας εισόδου */
  133. int maxlen; /* η τιμή επιστροφής της συνάρτησης */
  134.  
  135. do { /* απαίτηση πλήθους στοιχείων μεγαλύτερου από TABLE_BUF_MINLEN */
  136. printf("Μέγιστο πλήθος στοιχείων (τουλάχιστον %d): ", TABLE_BUF_MINLEN);
  137. fgets( inbuf, MAXINBUF, stdin );
  138. maxlen = atoi( inbuf );
  139. } while ( maxlen < TABLE_BUF_MINLEN );
  140.  
  141. return maxlen;
  142. }
  143. /* --------------------------------------------------------------------------------
  144.  *
  145.  * --------------------------------------------------------------------------------
  146.  */
  147. int main( void )
  148. {
  149. Table table; /* η βασική μας δομή */
  150. int maxlen = askuser_maxlen(); /* διάσβασμα μέγιστου πλήθους στοιχείων*/
  151.  
  152. if ( !table_init( &table, maxlen ) ) /* αποτυχία αρχικοποίησης της δομής */
  153. { /* ... */
  154. puts("*** αδυναμία δημιουργίας πίνακα, τερματισμός προγράμματος..." );
  155. exit( EXIT_FAILURE ); /* ... τερματισμός αποτυχίας */
  156. }
  157.  
  158. puts("\nΟ πίνακας δημιουργήθηκε & αρχικοποιήθηκε επιτυχώς!");
  159.  
  160. srand( time(NULL) ); /* ενεργοποίηση γεννήτριας ψευδοτυχαίων*/
  161.  
  162. table_print_info( table ); /* τύπωμα στατιστικών */
  163.  
  164. #if 0 /* ΠΡΟΣΩΡΙΝΑ ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ ΓΡΑΜΜΕΣ ΚΩΔΙΚΑ */
  165. if ( !table_fill_randomly( &table, 234 ) )
  166. puts("*** σφάλμα τυχαίου γέμισματος του πίνακα ( ήταν ήδη γεμάτος; )\n");
  167. table_print_info( table ); /* τύπωμα στατιστικών */
  168. #endif
  169.  
  170. table_print_buffer( table ); /* τύπωμα περιεχομένων του buffer */
  171.  
  172. table_cleanup( &table ); /* μηδενισμός δομής, αποδέσμευση buffer*/
  173.  
  174. exit( EXIT_SUCCESS ); /* τερματισμός επιτυχίας */
  175. }
  176.  
  177.  
stdin
10
compilation info
prog.c: In function ‘askuser_maxlen’:
prog.c:137: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
stdout
Μέγιστο πλήθος στοιχείων (τουλάχιστον 5): 
Ο πίνακας δημιουργήθηκε & αρχικοποιήθηκε επιτυχώς!

	Μέγιστη χωρητικότητα:		10 στοιχεία
	Πλήθος γεμάτων στοιχείων:	0
	Μέγεθος πίνακα στη μνήμη:	40 bytes