|
| 1 | +/* |
| 2 | + * Soubor: main.c |
| 3 | + * Datum: 25.10.2013 |
| 4 | + * Autor: 1BIA - Filip Gulan, [email protected] |
| 5 | + * Projekt: 1BIT cislo 1: Pocitanie slov |
| 6 | + * Popis viz: |
| 7 | + https://wis.fit.vutbr.cz/FIT/st/cwk.php?title=IZP:Projekt1&id=9416 |
| 8 | + */ |
| 9 | + |
| 10 | +#include <stdio.h> |
| 11 | +#include <stdlib.h> |
| 12 | +#include <string.h> |
| 13 | +#include <limits.h> |
| 14 | + |
| 15 | +#define MNOZINA (((znakvstup < '0') || (znakvstup > '9' && znakvstup < 'A') || (znakvstup > 'Z' && znakvstup < 'a') || (znakvstup > 'z') ) && (znakvstup != '-') && (znakvstup != '_')) //mnozina obsahujuca oddelovace slov |
| 16 | +#define MNOZINAARG (((argv[1][0] < '0') || (argv[1][0] > '9' && argv[1][0] < 'A') || (argv[1][0] > 'Z' && argv[1][0] < 'a') || (argv[1][0] > 'z') ) && (argv[1][0] != '-') && (argv[1][0] != '_') && (argv[1][0] != '^') && (argv[1][0] != '.') && (argv[1][0] != ':')) |
| 17 | +#define DEBUGZAPNUTY (1) |
| 18 | +#define DEBUGVYPNUTY (0) |
| 19 | +#define OBMEDZENIECHAR (80) //obmedzenie na pocet znakov pri debugu |
| 20 | +#define NEHLADAPOZICIU (0) |
| 21 | +#define CIFRA (10) //napr prechod z jendotiek na desiakty... |
| 22 | +#define CHYBNAPOZ (0) //chybna pozicia |
| 23 | + |
| 24 | +/* |
| 25 | + * Funkcia na vypisovanie napovedy. |
| 26 | + */ |
| 27 | +int napoveda() |
| 28 | +{ |
| 29 | + printf("Pocitanie slov 2013 \nVytvoril Filip Gulan (xgulan00) \n \n \nVitajte v napovede k programu Pocitanie slov 2013 vytvoreny v ramci 1 projektu pre premet IZP. \n \n"); |
| 30 | + printf("Program sluzi na pocitanie slov, ktore obsahuju blizsie specifikovany znak. Znak, popripade umiestnenie znaku specifikujeme pomocou argumentov. \n \n"); |
| 31 | + printf("Program spustajte v nasleduucej podobe: ./proj1 --help alebo ./proj1 X [N] [-d]\n \n"); |
| 32 | + printf("Popis argumentov: \n \n--help vypise na obrazovku napovedu k programu\n \n"); |
| 33 | + printf("X reprezentuje hladanyznak, argument je povinny, moze obsahovat znak 0-9, a-z, A-Z, znak - alebo _ ."); |
| 34 | + printf("Alebo moze obsahovat specialny znak : ktory symbolizuje lubovolne cislo od 0-9, znak ^ symbolizuje lubovolne velke pismeno A-Z a znak . symbolizuje lubovolny znak.\n \n"); |
| 35 | + printf("[N] predstavuje cislo pozicie hladaneho znaku v slove, je to volitelny argument, cislo je kladne prve pismeno v slove ma poziciu 1 \n \n"); |
| 36 | + printf("[-d] zapina tzv. ladiaci rezim, kedy sa vypisuju na obrazovku vsetky slova na novy riadok, argument je nepovinny. \n"); |
| 37 | + return 0; |
| 38 | +} |
| 39 | + |
| 40 | +/* |
| 41 | + * Funkcia na ziskanie z pola znakov cislo. |
| 42 | + */ |
| 43 | +int chartoint(char *argument) |
| 44 | +{ |
| 45 | + long int poziciah = 0; //poziciahladaneho znaku |
| 46 | + int i = 0; //na zistenie prebehnuteho poctu iteracii |
| 47 | + while (argument[i] != 0) |
| 48 | + { |
| 49 | + if (argument[i] > '9' || argument[i] < '0') |
| 50 | + { |
| 51 | + poziciah = CHYBNAPOZ; |
| 52 | + break; |
| 53 | + } |
| 54 | + poziciah = (argument[i] - '0') + poziciah * CIFRA; |
| 55 | + i++; |
| 56 | + } |
| 57 | + if (poziciah > INT_MAX) |
| 58 | + { |
| 59 | + poziciah = CHYBNAPOZ; |
| 60 | + } |
| 61 | + return poziciah; |
| 62 | +} |
| 63 | + |
| 64 | +/* |
| 65 | + * Funkcia na pocitanie slov s danym blizsie specifikovanym znakom. |
| 66 | + */ |
| 67 | +int moznosti(int hladanyznak, int poziciah, int debug) |
| 68 | +{ |
| 69 | + int znakvstup; //znakzovstupu |
| 70 | + int prepinacmedzera = 0; //prepinac medzera 0 nieje medzera 1 je medzera |
| 71 | + int obmedzenieznakov = 0; //premena na to aby sa nevypisovali znaky v slove na 80+ mieste |
| 72 | + int prepinacslovo = 0; //prepinac medzera 0 nieje slovo 1 je slovo |
| 73 | + int pocet = 0; //pocet slov zso specifikovanym znakom |
| 74 | + int poziciaznak = 0; //pozicia hladaneho znaku |
| 75 | + int prvyznak = 0; //premena na zistenie prveho znaku |
| 76 | + |
| 77 | + while (( znakvstup = getchar()) != EOF) //cyklus na ziskanie znakov zo vstupu |
| 78 | + { |
| 79 | + poziciaznak++; |
| 80 | + if (hladanyznak == ':') //hlada cislice v slove |
| 81 | + { |
| 82 | + if ((znakvstup >= '0' && znakvstup <= '9') && prepinacslovo == 0 && poziciah == 0) |
| 83 | + { |
| 84 | + pocet++; |
| 85 | + prepinacslovo = 1; |
| 86 | + } |
| 87 | + if ((znakvstup >= '0' && znakvstup <= '9') && prepinacslovo == 0 && poziciah == poziciaznak) |
| 88 | + { |
| 89 | + pocet++; |
| 90 | + prepinacslovo = 1; |
| 91 | + } |
| 92 | + else if (MNOZINA) |
| 93 | + { |
| 94 | + prepinacslovo = 0; |
| 95 | + poziciaznak = 0; |
| 96 | + } |
| 97 | + } |
| 98 | + else if (hladanyznak == '^') //hlada velke pismena v slove |
| 99 | + { |
| 100 | + if ((znakvstup >= 'A' && znakvstup <= 'Z') && prepinacslovo == 0 && poziciah == 0) |
| 101 | + { |
| 102 | + pocet++; |
| 103 | + prepinacslovo = 1; |
| 104 | + } |
| 105 | + if ((znakvstup >= 'A' && znakvstup <= 'Z') && prepinacslovo == 0 && poziciah == poziciaznak) |
| 106 | + { |
| 107 | + pocet++; |
| 108 | + prepinacslovo = 1; |
| 109 | + } |
| 110 | + else if (MNOZINA) |
| 111 | + { |
| 112 | + prepinacslovo = 0; |
| 113 | + poziciaznak = 0; |
| 114 | + } |
| 115 | + } |
| 116 | + else if (hladanyznak == '.') //hlada vsetky pismena v slove |
| 117 | + { |
| 118 | + if (MNOZINA) |
| 119 | + { |
| 120 | + prepinacslovo = 0; |
| 121 | + poziciaznak = 0; |
| 122 | + } |
| 123 | + else if (prepinacslovo == 0 && poziciah == 0) |
| 124 | + { |
| 125 | + pocet++; |
| 126 | + prepinacslovo = 1; |
| 127 | + } |
| 128 | + else if (prepinacslovo == 0 && poziciah == poziciaznak) |
| 129 | + { |
| 130 | + pocet++; |
| 131 | + prepinacslovo = 1; |
| 132 | + } |
| 133 | + } |
| 134 | + else //inak hlada blizsie specifikovany znak |
| 135 | + { |
| 136 | + if ((znakvstup == hladanyznak) && prepinacslovo == 0 && poziciah == 0) |
| 137 | + { |
| 138 | + pocet++; |
| 139 | + prepinacslovo = 1; |
| 140 | + } |
| 141 | + if ((znakvstup == hladanyznak) && prepinacslovo == 0 && poziciah == poziciaznak) |
| 142 | + { |
| 143 | + pocet++; |
| 144 | + prepinacslovo = 1; |
| 145 | + } |
| 146 | + else if (MNOZINA) |
| 147 | + { |
| 148 | + prepinacslovo = 0; |
| 149 | + poziciaznak = 0; |
| 150 | + } |
| 151 | + } |
| 152 | + |
| 153 | + if (debug == DEBUGZAPNUTY) //debug mod, vypisuje vsetky slova |
| 154 | + { |
| 155 | + if((MNOZINA) && prepinacmedzera == 0 && prvyznak == 1) |
| 156 | + { |
| 157 | + putchar('\n'); |
| 158 | + prepinacmedzera = 1; |
| 159 | + obmedzenieznakov = 0; |
| 160 | + } |
| 161 | + else if (!(MNOZINA) && obmedzenieznakov <= OBMEDZENIECHAR) |
| 162 | + { |
| 163 | + putchar(znakvstup); |
| 164 | + prepinacmedzera = 0; |
| 165 | + obmedzenieznakov++; |
| 166 | + prvyznak = 1; |
| 167 | + } |
| 168 | + } |
| 169 | + } |
| 170 | + printf("%d\n", pocet); |
| 171 | + return 0; |
| 172 | +} |
| 173 | + |
| 174 | +/* |
| 175 | + * Funkcia main, ktora spracovava argumenty a nasledne vola funkcie |
| 176 | + */ |
| 177 | +int main(int argc, char *argv[]) |
| 178 | +{ |
| 179 | + if (argc == 2 && !(MNOZINAARG)) |
| 180 | + { |
| 181 | + if (strcmp(argv[1], "--help") == 0) //vypisanie napovedy |
| 182 | + { |
| 183 | + napoveda(); |
| 184 | + } |
| 185 | + else if (strlen(argv[1]) == 1) |
| 186 | + { |
| 187 | + moznosti(argv[1][0], NEHLADAPOZICIU ,DEBUGVYPNUTY); |
| 188 | + } |
| 189 | + else |
| 190 | + { |
| 191 | + printf("Argumenty neboli zadane spravne!\n"); |
| 192 | + return 1; |
| 193 | + } |
| 194 | + } |
| 195 | + else if (argc == 3 && !(MNOZINAARG)) |
| 196 | + { |
| 197 | + if (strlen(argv[1]) == 1 && strcmp(argv[2], "-d") == 0) |
| 198 | + { |
| 199 | + moznosti(argv[1][0], NEHLADAPOZICIU, DEBUGZAPNUTY); |
| 200 | + } |
| 201 | + else if (strlen(argv[1]) == 1 && strcmp(argv[2], "-d") != 0) |
| 202 | + { |
| 203 | + int poziciah = chartoint(argv[2]); |
| 204 | + if (poziciah <= CHYBNAPOZ) |
| 205 | + { |
| 206 | + printf("Argumenty neboli zadane spravne!\n"); |
| 207 | + return 1; |
| 208 | + } |
| 209 | + moznosti(argv[1][0], poziciah, DEBUGVYPNUTY); |
| 210 | + } |
| 211 | + else |
| 212 | + { |
| 213 | + printf("Argumenty neboli zadane spravne!\n"); |
| 214 | + return 1; |
| 215 | + } |
| 216 | + } |
| 217 | + else if (argc == 4 && !(MNOZINAARG)) |
| 218 | + { |
| 219 | + if (strlen(argv[1]) == 1 && strcmp(argv[2], "-d") == 0) |
| 220 | + { |
| 221 | + int poziciah = chartoint(argv[3]); |
| 222 | + if (poziciah <= CHYBNAPOZ) |
| 223 | + { |
| 224 | + printf("Argumenty neboli zadane spravne!\n"); |
| 225 | + return 1; |
| 226 | + } |
| 227 | + moznosti(argv[1][0], poziciah, DEBUGZAPNUTY); |
| 228 | + } |
| 229 | + else if (strlen(argv[1]) == 1 && strcmp(argv[3], "-d") == 0) |
| 230 | + { |
| 231 | + int poziciah = chartoint(argv[2]); |
| 232 | + if (poziciah <= CHYBNAPOZ) |
| 233 | + { |
| 234 | + printf("Argumenty neboli zadane spravne!\n"); |
| 235 | + return 1; |
| 236 | + } |
| 237 | + moznosti(argv[1][0], poziciah, DEBUGZAPNUTY); |
| 238 | + } |
| 239 | + else |
| 240 | + { |
| 241 | + printf("Argumenty neboli zadane spravne!\n"); |
| 242 | + return 1; |
| 243 | + } |
| 244 | + } |
| 245 | + else |
| 246 | + { |
| 247 | + printf("Argumenty neboli zadane spravne!\n"); |
| 248 | + return 1; |
| 249 | + } |
| 250 | + return 0; |
| 251 | +} |
0 commit comments