fork download
  1. #include <stdio.h>
  2. #include <string.h> /* για memset() */
  3. #include <stdlib.h> /* για exit(), calloc(), free(), κλπ */
  4.  
  5. #define MAXINBUF 254+1 /* μέγιστο μήκος γραμμής εισόδου */
  6.  
  7. #define TABLE_MINLEN 5 /* ελάχιστο πλήθος στοιχείων */
  8. #define TABLE_EMPTYCELL -1 /* για μαρκάρισμα κενών στοιχείων */
  9.  
  10. /* --------------------------------------------------------------------------------
  11.  * Επιστρέφει το πλήθος των γεμάτων στοιχειων του πίνακα table
  12.  * --------------------------------------------------------------------------------
  13.  */
  14. int tablen( int *table, const int maxtablen )
  15. {
  16. register int i = 0;
  17.  
  18. if ( !table ) /* έλεγχος ασφαλείας */
  19. return 0; /* ... πρόωρη έξοδος */
  20.  
  21. for (i=0; i < maxtablen; i++)
  22. if ( table[i] == TABLE_EMPTYCELL )
  23. return i;
  24.  
  25. return 0;
  26. }
  27. /* --------------------------------------------------------------------------------
  28.  * Τυπώνει στατιστικά σχετικά με τον πίνακα table ( μέγιστη χωρητικότητα σε στοιχεία,
  29.  * πλήθος γεμάτων στοιχείων και μέγεθος που καταλαμβάνει ο πίνακας στη μνήμη )
  30.  * --------------------------------------------------------------------------------
  31.  */
  32. void table_print_stats( int *table, const int maxtablen, const int tabsize )
  33. {
  34. if ( !table ) /* έλεγχος ασφαλείας */
  35. return; /* ... πρόωρη έξοδος */
  36.  
  37. printf("\n\tΜέγιστη χωρητικότητα:\t\t%d στοιχεία\n", maxtablen);
  38. printf("\tΠλήθος γεμάτων στοιχείων:\t%d\n", tablen(table, maxtablen) );
  39. printf("\tΜέγεθος πίνακα στη μνήμη:\t%d bytes\n\n", tabsize );
  40.  
  41. return;
  42. }
  43. /* --------------------------------------------------------------------------------
  44.  * Τυπώνει τα μη κενά ατοιχεία του πίνακα table
  45.  * --------------------------------------------------------------------------------
  46.  */
  47. void table_print_contents( int *table, const int maxtablen )
  48. {
  49. register int i = 0;
  50.  
  51. if ( !table ) /* έλεγχος ασφαλείας */
  52. return; /* ... πρόωρη έξοδος */
  53.  
  54. for (i=0; i < maxtablen; i++)
  55. if ( table[i] != TABLE_EMPTYCELL )
  56. printf("%d ", table[i] );
  57.  
  58. putchar('\n');
  59.  
  60. return;
  61. }
  62. /* -------------------------------------------------------------------------------- */
  63. int main( void )
  64. {
  65. char inbuf[ MAXINBUF ] = { '\0' }; /* δική μας γραμμή κύριας εισόδου */
  66. int *table = NULL; /* ο πίνακάς μας */
  67. int maxtablen = 0; /* μέγιστο πλήθος στοιχείων */
  68. int tabsize = 0; /* μέγεθος του πίνακα στη μνήμη */
  69. /* απαίτηση πλήθους στοιχείων... */
  70. do { /* ... μεγαλύτερου από TABLE_MINLEN */
  71. printf("Μέγιστο πλήθος στοιχείων (τουλάχιστον %d): ", TABLE_MINLEN);
  72. fgets( inbuf, MAXINBUF, stdin );
  73. maxtablen = atoi( inbuf );
  74. } while ( maxtablen < TABLE_MINLEN );
  75.  
  76. tabsize = maxtablen * sizeof(int); /* υπολογισμός μεγέθους στη μνήμη */
  77.  
  78. table = malloc( tabsize ); /* δέσμευση μνήμης για τον πίνακα */
  79. if ( !table ) { /* αποτυχία δέσμευσης μνήμης */
  80. puts("*** σφάλμα: ανεπαρκής μνήμη, τερματισμός προγράμματος..." );
  81. exit( EXIT_FAILURE ); /* ... τερματισμός προγράμματος */
  82. }
  83.  
  84. memset(table, TABLE_EMPTYCELL, tabsize);/* αρχικοποίηση όλων των στοιχείων */
  85.  
  86. puts("\nΟ πίνακας δημιουργήθηκε & αρχικοποιήθηκε επιτυχώς!");
  87. table_print_stats( table, maxtablen, tabsize ); /* τύπωμα στατιστικών */
  88.  
  89. table_print_contents( table, maxtablen );
  90.  
  91. if ( table ) { /* ο πίνακας δεν είναι NULL */
  92. free( table ); /* ... αποδέσμευση της μνήμης του */
  93. table = NULL; /* ... κάνε έγκυρο τον δείκτη */
  94. }
  95.  
  96. exit( EXIT_SUCCESS ); /* επιτυχής τερματισμός προγράμματος */
  97. }
  98.  
stdin
10
compilation info
prog.c: In function ‘main’:
prog.c:72: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
stdout
Μέγιστο πλήθος στοιχείων (τουλάχιστον 5): 
Ο πίνακας δημιουργήθηκε & αρχικοποιήθηκε επιτυχώς!

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