Guest User

Untitled

a guest
Jan 21st, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. /*
  2. * Soubor: proj1.c
  3. * Datum: 2012/10/15
  4. * Autor: Gregor Kaclík, xkacli00@stud.fit.vutbr.cz
  5. * Projekt: Tvorba histogramu
  6. * Popis: Program vypocita pocetnost znakov vstupneho textu. Po znakoch precita vsetky znaky zo standardneho vstupu
  7. * a vypise textovu tabulku s ich pocetnostou.
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <limits.h>
  14. #include <assert.h>
  15. #include <stdbool.h>
  16.  
  17. /** Kódy chyb programu */
  18. enum ecodes
  19. {
  20. EOK = 0, /**< Bez chyby */
  21. ECLWRONG, /**< Chybny prikazovy riadok */
  22. EUNKNOWN, /**< Neznámá chyba */
  23. };
  24.  
  25. /** Stavové kódy programu */
  26. enum states
  27. {
  28. SHELP, /**< Help message */
  29. SORDINAL, /**< Vypise vsetky znaky v poradi danom ordinalnymi hodnotami */
  30. SFREQ, /**< Vypise pocet roznych znakov podla parametru zadaneho v prikazovom riadku a zoradi podla poctu */
  31. };
  32.  
  33.  
  34. /** Chybove hlasenia odpovedajuce chybovym stavom programu */
  35. const char *ECODEMSG[] =
  36. {
  37. [EOK] = "Bez chyby.\n",
  38. [ECLWRONG] = "Chybne parametre prikazoveho riadku.\n",
  39. [EUNKNOWN] = "Neznama chyba.\n",
  40. };
  41.  
  42. const char *HELPMSG =
  43. "Tvorba histogramu\n"
  44. "Autor: Gregor Kaclik\n"
  45. "Spustenie bez parametra: Program spracuje vsetky znaky znaky zo standardneho vstupu a vypise textovu tabulku s ich pocetnostou zoradenou podla ich ordinalnej hodnoty.\n"
  46. "Spustenie s parametrom: Parameter musi byt cele cislo, program spracuje znaky zo standardneho vstupu a vypise X najpocetnejsich znakov aj s ich pocetnostou,"
  47. "kde X je parameter z prikazoveho riadku\n"
  48. "Parameter -h: Vypise help message.\n";
  49.  
  50. typedef struct params
  51. {
  52. unsigned short N; /**< Hodnota N z prikazoveho riadku */
  53. int ecode; /**< Chybový kód programu */
  54. int state; /**< Stavový kód programu */
  55. } TParams;
  56.  
  57. void printECode(int ecode) /** Fukncia na vypisanie chyboveho hlasenia */
  58. {
  59. if (ecode < EOK || ecode > EUNKNOWN)
  60. { ecode = EUNKNOWN; }
  61.  
  62. fprintf(stderr, "%s", ECODEMSG[ecode]);
  63. }
  64.  
  65. /** Funkcia na spracovanie vstupnych parametrov z prikazoveho riadku */
  66. TParams getParams(int argc, char *argv[])
  67. {
  68. TParams result = /** Nastavenie pociatocnych hodnot */
  69. {
  70. .N = 0,
  71. .ecode = EOK,
  72. .state = SORDINAL,
  73. };
  74.  
  75. if(argc == 1)
  76. {
  77. result.state = SORDINAL; /** Bez parametru */
  78. }
  79. if(argc == 2) /** 1 parameter */
  80. {
  81. int i = 0;
  82. int cislo = 0;
  83.  
  84. if(strcmp("-h", argv[1]) == 0)
  85. {
  86. result.state = SHELP; /** Nastavi stavovy kod programu na SHELP */
  87. }
  88. else
  89. {
  90. while(argv[1][i] != '\0') /** Kontrola, ci je vstupny parameter cislo */
  91. {
  92. if(argv[1][i] >= '0' && argv[1][i] <= '9')
  93. {
  94. cislo = cislo * 10 + (argv[1][i] - '0');
  95. result.state = SFREQ;
  96. result.N = cislo; /** Prevod na cislo a ulozenie hodnoty do result.N */
  97. i++;
  98. }
  99. else
  100. {
  101. result.ecode = ECLWRONG; /** Ak vstupny parameter nie je cislo, nastavi chybovy kod */
  102. return result;
  103. }
  104. }
  105. }
  106. }
  107. if(argc > 2) /** Prilis vela vstupnych parametrov, nastavi chybovy kod */
  108. {
  109. result.ecode = ECLWRONG;
  110. }
  111. return result;
  112. }
  113.  
  114. /** Funkcia na nacitanie znakov zo standadneho vstupu do pola */
  115. int citanie(int array[])
  116. {
  117. unsigned char i;
  118. int vstup;
  119. for (int i = 0; i < 256; i++) /** Vynulovanie pola */
  120. {
  121. array[i]=0;
  122. }
  123. while((vstup = getchar()) != EOF) /** Spracuvava znaky kym nie je EOF */
  124. {
  125. if(array[vstup] == UCHAR_MAX - 1) /** V pripade, ze by pocetnost znaku mala prekrocit max. hodnotu, nastavi UCHAR_MAX */
  126. {
  127. array[vstup] = UCHAR_MAX;
  128. }
  129. if(array[vstup] != UCHAR_MAX) /** Inak zvysi pocetnost o 1 */
  130. {
  131. array[vstup] = array[vstup]+1;
  132. }
  133. }
  134.  
  135. }
  136.  
  137. /** Funkcia na vypisanie znakov */
  138. void pisanie(int array[])
  139. {
  140. for (int i = 0; i < 256; i++) /** Prejde postupne vsetky znaky pola */
  141. {
  142. if(array[i] == UCHAR_MAX) /** Ak je hodnota nastavena na UCHAR_MAX, vypisuje namiesto pocetnosti NNN */
  143. {
  144. if(isprint(i)==0){ /** Kontrola, ci je znak citatelny, alebo nie */
  145. printf("%d: NNN\n", i, array[i]);
  146. }
  147. else
  148. printf("%d '%c': NNN\n", i, i, array[i]);
  149. }
  150. if(array[i] > 0 && array[i] != UCHAR_MAX) /** Vypisuje postupne znaky s nenulovou pocetnostou a tie, ktore nemaju pocetnost NNN */
  151. {
  152. if(isprint(i)==0){
  153. printf("%d: %d\n", i, array[i]);
  154. }
  155. else
  156. printf("%d '%c': %d\n", i, i, array[i]);
  157. }
  158. }
  159. }
  160.  
  161. /** Funkcia na vypisanie znakov, zoradenych podla pocetnosti, vyuziva vstupny parameter N */
  162. void pisanieparameter(unsigned short parameter, int array[])
  163. {
  164. int position = 0;
  165. int maxvalue = 0;
  166. for (parameter; parameter != 0; parameter--) /** Funkcia vypise tolko roznych znakov, kolko bolo zadanych vstupnym parametrom */
  167. {
  168. for (int i = 0; i < 256; i++) /** Cyklus prejde postupne cele pole */
  169. {
  170. if(array[i] > maxvalue) /** Hlada znak s najvyssou pocetnostou, v pripade rovnakej pocetnosti zobere znak s nizsou ordinalnou hodnotou */
  171. {
  172. maxvalue = array[i];
  173. position = i;
  174. }
  175. }
  176. if(array[position] == UCHAR_MAX) /** Vypise znak, ktory vybral z pola */
  177. {
  178. if(isprint(position)==0){
  179. printf("%d: NNN\n", position, array[position]);
  180. }
  181. else
  182. printf("%d '%c': NNN\n", position, position, array[position]);
  183. }
  184. if(array[position] > 0 && array[position] != UCHAR_MAX)
  185. {
  186. if(isprint(position)==0){
  187. printf("%d: %d\n", position, array[position]);
  188. }
  189. else
  190. printf("%d '%c': %d\n",position, position, array[position]);
  191. }
  192. array[position] = 0; /** Vynuluje pocetnost znaku, ktory bol vypisany */
  193. maxvalue = 0; /** Vynuluje temporary maxvalue */
  194. }
  195. }
  196.  
  197. /** Hlavny program */
  198. int main(int argc, char *argv[])
  199. {
  200. int array[257];
  201. TParams params = getParams(argc, argv);
  202. if (params.ecode != EOK)
  203. {
  204. printECode(params.ecode);
  205. return EXIT_FAILURE;
  206. }
  207.  
  208. if (params.state == SHELP)
  209. {
  210. printf("%s", HELPMSG);
  211. return EXIT_SUCCESS;
  212. }
  213.  
  214. if(params.state == SORDINAL)
  215. {
  216. array[256]=citanie(array);
  217. pisanie(array);
  218. }
  219.  
  220. if(params.state == SFREQ)
  221. {
  222. array[256]=citanie(array);
  223. pisanieparameter(params.N, array);
  224. }
  225.  
  226. return EXIT_SUCCESS;
  227. }
Add Comment
Please, Sign In to add comment