Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Soubor: proj1.c
- * Datum: 2012/10/15
- * Autor: Gregor Kaclík, xkacli00@stud.fit.vutbr.cz
- * Projekt: Tvorba histogramu
- * Popis: Program vypocita pocetnost znakov vstupneho textu. Po znakoch precita vsetky znaky zo standardneho vstupu
- * a vypise textovu tabulku s ich pocetnostou.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #include <assert.h>
- #include <stdbool.h>
- /** Kódy chyb programu */
- enum ecodes
- {
- EOK = 0, /**< Bez chyby */
- ECLWRONG, /**< Chybny prikazovy riadok */
- EUNKNOWN, /**< Neznámá chyba */
- };
- /** Stavové kódy programu */
- enum states
- {
- SHELP, /**< Help message */
- SORDINAL, /**< Vypise vsetky znaky v poradi danom ordinalnymi hodnotami */
- SFREQ, /**< Vypise pocet roznych znakov podla parametru zadaneho v prikazovom riadku a zoradi podla poctu */
- };
- /** Chybove hlasenia odpovedajuce chybovym stavom programu */
- const char *ECODEMSG[] =
- {
- [EOK] = "Bez chyby.\n",
- [ECLWRONG] = "Chybne parametre prikazoveho riadku.\n",
- [EUNKNOWN] = "Neznama chyba.\n",
- };
- const char *HELPMSG =
- "Tvorba histogramu\n"
- "Autor: Gregor Kaclik\n"
- "Spustenie bez parametra: Program spracuje vsetky znaky znaky zo standardneho vstupu a vypise textovu tabulku s ich pocetnostou zoradenou podla ich ordinalnej hodnoty.\n"
- "Spustenie s parametrom: Parameter musi byt cele cislo, program spracuje znaky zo standardneho vstupu a vypise X najpocetnejsich znakov aj s ich pocetnostou,"
- "kde X je parameter z prikazoveho riadku\n"
- "Parameter -h: Vypise help message.\n";
- typedef struct params
- {
- unsigned short N; /**< Hodnota N z prikazoveho riadku */
- int ecode; /**< Chybový kód programu */
- int state; /**< Stavový kód programu */
- } TParams;
- void printECode(int ecode) /** Fukncia na vypisanie chyboveho hlasenia */
- {
- if (ecode < EOK || ecode > EUNKNOWN)
- { ecode = EUNKNOWN; }
- fprintf(stderr, "%s", ECODEMSG[ecode]);
- }
- /** Funkcia na spracovanie vstupnych parametrov z prikazoveho riadku */
- TParams getParams(int argc, char *argv[])
- {
- TParams result = /** Nastavenie pociatocnych hodnot */
- {
- .N = 0,
- .ecode = EOK,
- .state = SORDINAL,
- };
- if(argc == 1)
- {
- result.state = SORDINAL; /** Bez parametru */
- }
- if(argc == 2) /** 1 parameter */
- {
- int i = 0;
- int cislo = 0;
- if(strcmp("-h", argv[1]) == 0)
- {
- result.state = SHELP; /** Nastavi stavovy kod programu na SHELP */
- }
- else
- {
- while(argv[1][i] != '\0') /** Kontrola, ci je vstupny parameter cislo */
- {
- if(argv[1][i] >= '0' && argv[1][i] <= '9')
- {
- cislo = cislo * 10 + (argv[1][i] - '0');
- result.state = SFREQ;
- result.N = cislo; /** Prevod na cislo a ulozenie hodnoty do result.N */
- i++;
- }
- else
- {
- result.ecode = ECLWRONG; /** Ak vstupny parameter nie je cislo, nastavi chybovy kod */
- return result;
- }
- }
- }
- }
- if(argc > 2) /** Prilis vela vstupnych parametrov, nastavi chybovy kod */
- {
- result.ecode = ECLWRONG;
- }
- return result;
- }
- /** Funkcia na nacitanie znakov zo standadneho vstupu do pola */
- int citanie(int array[])
- {
- unsigned char i;
- int vstup;
- for (int i = 0; i < 256; i++) /** Vynulovanie pola */
- {
- array[i]=0;
- }
- while((vstup = getchar()) != EOF) /** Spracuvava znaky kym nie je EOF */
- {
- if(array[vstup] == UCHAR_MAX - 1) /** V pripade, ze by pocetnost znaku mala prekrocit max. hodnotu, nastavi UCHAR_MAX */
- {
- array[vstup] = UCHAR_MAX;
- }
- if(array[vstup] != UCHAR_MAX) /** Inak zvysi pocetnost o 1 */
- {
- array[vstup] = array[vstup]+1;
- }
- }
- }
- /** Funkcia na vypisanie znakov */
- void pisanie(int array[])
- {
- for (int i = 0; i < 256; i++) /** Prejde postupne vsetky znaky pola */
- {
- if(array[i] == UCHAR_MAX) /** Ak je hodnota nastavena na UCHAR_MAX, vypisuje namiesto pocetnosti NNN */
- {
- if(isprint(i)==0){ /** Kontrola, ci je znak citatelny, alebo nie */
- printf("%d: NNN\n", i, array[i]);
- }
- else
- printf("%d '%c': NNN\n", i, i, array[i]);
- }
- if(array[i] > 0 && array[i] != UCHAR_MAX) /** Vypisuje postupne znaky s nenulovou pocetnostou a tie, ktore nemaju pocetnost NNN */
- {
- if(isprint(i)==0){
- printf("%d: %d\n", i, array[i]);
- }
- else
- printf("%d '%c': %d\n", i, i, array[i]);
- }
- }
- }
- /** Funkcia na vypisanie znakov, zoradenych podla pocetnosti, vyuziva vstupny parameter N */
- void pisanieparameter(unsigned short parameter, int array[])
- {
- int position = 0;
- int maxvalue = 0;
- for (parameter; parameter != 0; parameter--) /** Funkcia vypise tolko roznych znakov, kolko bolo zadanych vstupnym parametrom */
- {
- for (int i = 0; i < 256; i++) /** Cyklus prejde postupne cele pole */
- {
- if(array[i] > maxvalue) /** Hlada znak s najvyssou pocetnostou, v pripade rovnakej pocetnosti zobere znak s nizsou ordinalnou hodnotou */
- {
- maxvalue = array[i];
- position = i;
- }
- }
- if(array[position] == UCHAR_MAX) /** Vypise znak, ktory vybral z pola */
- {
- if(isprint(position)==0){
- printf("%d: NNN\n", position, array[position]);
- }
- else
- printf("%d '%c': NNN\n", position, position, array[position]);
- }
- if(array[position] > 0 && array[position] != UCHAR_MAX)
- {
- if(isprint(position)==0){
- printf("%d: %d\n", position, array[position]);
- }
- else
- printf("%d '%c': %d\n",position, position, array[position]);
- }
- array[position] = 0; /** Vynuluje pocetnost znaku, ktory bol vypisany */
- maxvalue = 0; /** Vynuluje temporary maxvalue */
- }
- }
- /** Hlavny program */
- int main(int argc, char *argv[])
- {
- int array[257];
- TParams params = getParams(argc, argv);
- if (params.ecode != EOK)
- {
- printECode(params.ecode);
- return EXIT_FAILURE;
- }
- if (params.state == SHELP)
- {
- printf("%s", HELPMSG);
- return EXIT_SUCCESS;
- }
- if(params.state == SORDINAL)
- {
- array[256]=citanie(array);
- pisanie(array);
- }
- if(params.state == SFREQ)
- {
- array[256]=citanie(array);
- pisanieparameter(params.N, array);
- }
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment