Advertisement
hocikto19

Pisomka PrPr2

Apr 8th, 2014
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. //#define LADENIE
  7. #define SUBOR "poplatky.txt"
  8. #define ARRAYSIZE 53
  9. #define ABECEDA ('Z' - 'A' + 1)
  10. #define islower(x) (((x)>='a' && (x)<='z')? 1:0)
  11. #define isupper(x) (((x)>='A' && (x)<='Z')? 1:0)
  12.  
  13. void vypis(FILE **p_fr);
  14. void najpoplatky(FILE *fr);
  15. int nacitajstr(FILE *fr, char ***arrofstr, int polozky);
  16. void vypisstr(char **arrofstr, int n);
  17. void cesar(char **arrofstr, int n);
  18. void albam(char **arrofstr, int n);
  19. int fcia_b(char ***arrofstr, int n);
  20. void histogram(char **arrofstr, int n);
  21.  
  22. int main(){
  23.     FILE *fr = NULL;
  24.     char volba, **arrofstr = NULL;
  25.     int zaznamy = 0;
  26.     while ((volba = getchar()) != 'k'){
  27.         while (getchar() != '\n');
  28.         switch (volba){
  29.         case 'v': vypis(&fr); break; //vypise subor
  30.         case 'p': najpoplatky(fr); break; //vypis najvyssieho poplatku
  31.         case 'n': zaznamy = nacitajstr(fr, &arrofstr, zaznamy); break; //nacitanie meno priezvisko
  32.         case 'm': vypisstr(arrofstr, zaznamy); break; //vypis meno priezvisko
  33.         case 'c': cesar(arrofstr, zaznamy); break; //cesarova sifra
  34.         case 'a': albam(arrofstr, zaznamy); break; //sifra albam
  35.         case 'b': zaznamy = fcia_b(&arrofstr, zaznamy); break; //funkcia b sifruje neparne riadky
  36.         case 'd': histogram(arrofstr, zaznamy); break; //vypise histogram riadkov delitelnych nacitanym cislom
  37.         }
  38.     }
  39.     if (fr != NULL){
  40.         if (fclose(fr) == EOF)
  41.             printf("Subor sa nezatvoril\n");
  42.     }
  43.     return 0;
  44. }
  45.  
  46. //fcia na vypis suboru
  47. void vypis(FILE **p_fr){
  48.     char buf[ARRAYSIZE];
  49. #ifdef LADENIE
  50.     printf("Otvaram subor %s!\n", SUBOR);
  51. #endif
  52.     if ((*p_fr = fopen(SUBOR, "r")) == NULL){
  53.         printf("Neotvoreny subor\n");
  54.         return;
  55.     }
  56.     fgets(buf, ARRAYSIZE, *p_fr);
  57.     while (!feof(*p_fr)){
  58.  
  59.         printf("priezvisko meno: %s", buf);
  60.         fgets(buf, ARRAYSIZE, *p_fr);
  61.         printf("ulica cislo: %s", buf);
  62.         fgets(buf, ARRAYSIZE, *p_fr);
  63.         printf("domova dan: %s", buf);
  64.         fgets(buf, ARRAYSIZE, *p_fr);
  65.         printf("odvoz odpadu: %s", buf);
  66.         fgets(buf, ARRAYSIZE, *p_fr);
  67.         printf("datum: %s\n", buf);
  68.         fgets(buf, ARRAYSIZE, *p_fr);
  69.         fgets(buf, ARRAYSIZE, *p_fr);
  70.     }
  71.     rewind(*p_fr);
  72. }
  73.  
  74. //Po aktivovaní vypíše najvyššie zaplatené
  75. //poplatky(domova dan + odvoz odpadu) obyvateľa bývajúceho na zadanej
  76. //ulici zapísanú v súbore za posledný rok(t.j.najvyšší rok v súbore).
  77. void najpoplatky(FILE *fr){
  78.     char buf[ARRAYSIZE], stdin_adresa[ARRAYSIZE], fr_adresa[ARRAYSIZE], dan[ARRAYSIZE], odpad[ARRAYSIZE];
  79.     double akt_dan, akt_poplatok, max_dan = -1, max_poplatok = -1;
  80.     int rok, najrok = 0, i, flag = 0;
  81.     fgets(stdin_adresa, ARRAYSIZE, stdin);
  82.     stdin_adresa[strlen(stdin_adresa) - 1] = '\0';
  83. #ifdef LADENIE
  84.     printf("Kontrola suboru!\n");
  85. #endif
  86.     if (fr == NULL){
  87. #ifdef LADENIE
  88.         printf("Subor este neotvoreny\n");
  89. #endif
  90.         return;
  91.     }
  92.     //najskor zistim najvyssi rok v subore
  93.     while (!feof(fr)){
  94.         //nacita datum ako piaty riadok zaznamu
  95.         for (i = 0; i < 5; i++)
  96.             fgets(buf, ARRAYSIZE, fr);
  97.         rok = atoi(&buf[4]);
  98.         //ulozim si najvyssi rok
  99.         if (najrok < rok)
  100.             najrok = rok;
  101.         //nacitam prazdny riadok
  102.         fgets(buf, ARRAYSIZE, fr);
  103.     }
  104.     rewind(fr);
  105. #ifdef LADENIE
  106.     printf("Najvyssi zisteny rok: %d\n", najrok);
  107. #endif
  108.     //zistim kde v subore sa este nachadza dany rok
  109.     //a ak sa zhoduje adresa, vytlacim
  110.     while (!feof(fr)){
  111.         fgets(buf, ARRAYSIZE, fr);
  112.         fgets(fr_adresa, ARRAYSIZE, fr);
  113.         fgets(dan, ARRAYSIZE, fr);
  114.         fgets(odpad, ARRAYSIZE, fr);
  115.         fgets(buf, ARRAYSIZE, fr);
  116.         rok = atoi(&buf[4]);
  117.         if (rok == najrok){
  118.             //ak sa mi zhoduje rok, tak z adresy zo suboru
  119.             //orezem cislo a porovnam z adresou zo stdin
  120.             *(strrchr(fr_adresa, ' ')) = '\0';
  121.             if (!(strcmp(stdin_adresa, fr_adresa))){
  122.                 //ak sedi adresa tak si skonvertujem retazce s poplatkami
  123.                 //na double a porovnam s najvyssou nameranou hodnotou
  124.                 //ak to bude viac, tak to prepisem
  125.                 akt_dan = atof(dan);
  126.                 akt_poplatok = atof(odpad);
  127.                 if ((akt_dan + akt_poplatok) > (max_dan + max_poplatok)){
  128.                     max_dan = akt_dan;
  129.                     max_poplatok = akt_poplatok;
  130.                     flag = 1;
  131.                 }
  132.             }
  133.         }
  134.         fgets(buf, ARRAYSIZE, fr);
  135.     }
  136.     if (flag)
  137.         printf("%g\n", max_dan + max_poplatok);
  138. #ifdef LADENIE
  139.     else
  140.         printf("V najvyssom roku v subore tj. %d z ulice: %s neplatil poplatky\n", najrok, stdin_adresa);
  141. #endif
  142.     rewind(fr);
  143.     putchar('\n');
  144. }
  145.  
  146. int nacitajstr(FILE *fr, char ***arrofstr, int polozky){
  147.     int zaznamy = 0, zaznamov = 1, dlzka, i, j;
  148.     if (fr == NULL){
  149. #ifdef LADENIE
  150.         printf("Subor este neotvoreny\n");
  151. #endif
  152.         return 0;
  153.     }
  154.     //zistim pocet riadkov
  155.     while ((i = getc(fr)) != EOF){
  156.         if (i == '\n')
  157.             zaznamov++;
  158.     }
  159.     //zaznamov je pocet riadkov celkovo / riadky na zaznam
  160.     zaznamov /= 6;
  161.     //ak na nejake pole ukazujem, tak ho zmazem
  162.     if (*arrofstr != NULL){
  163.         for (i = 0; i < polozky; i++){
  164.             free(*(*arrofstr + i));
  165.         }
  166.         free(*arrofstr);
  167.         *arrofstr = NULL;
  168.     }
  169.     //vytvorim pole pointrov na retazce o velkosti poctu poloziek suboru
  170.     *arrofstr = (char**)malloc(zaznamov * sizeof(char*));
  171.     //kontrola alokacie pamati
  172.     if (*arrofstr == NULL){
  173.         printf("Malloc failed, deal with it\n");
  174.         return 0;
  175.     }
  176.     rewind(fr);
  177.     while (!feof(fr)){
  178.         rewind(fr);
  179.         //nastavim sa na poslednu znamu poziciu
  180.         for (i = 0; i < zaznamy; i++){
  181.             for (j = 0; j < 6; j++){
  182.                 while (getc(fr) != '\n');
  183.             }
  184.         }
  185.         dlzka = 1;
  186.         //zistim dlzku riadku
  187.         while (getc(fr) != '\n')
  188.             dlzka++;
  189.         rewind(fr);
  190.         //vratim sa tam odkial som zacal pocitat
  191.         for (i = 0; i < zaznamy; i++){
  192.             for (j = 0; j < 6; j++){
  193.                 while (getc(fr) != '\n');
  194.             }
  195.         }
  196.         //vygenerujem si pole dostatocne dlhe na string
  197.         *(*arrofstr + zaznamy) = (char*)malloc(dlzka * sizeof(char));
  198.         //kontrola alokacie pamati
  199.         if (*(*arrofstr + zaznamy) == NULL){
  200.             printf("Malloc failed, deal with it\n");
  201.             return 0;
  202.         }
  203.         //nacitam riadok do pola
  204.         fgets(*(*arrofstr + zaznamy), dlzka, fr);
  205. #ifdef LADENIE
  206.         printf("%s\n", *(*arrofstr + zaznamy));
  207. #endif
  208.         zaznamy++;
  209.         //idem na koniec zaznamu, aby som mohol zistit, ci je koncom suboru
  210.         for (i = 0; i <= 6; i++){
  211.             while ((j = getc(fr)) != '\n')
  212.             if (j == EOF)
  213.                 break;
  214.         }
  215.     }
  216.     rewind(fr);
  217.     putchar('\n');
  218.     return zaznamy;
  219. }
  220.  
  221. void vypisstr(char **arrofstr, int n){
  222.     int i;
  223. #ifdef LADENIE
  224.     printf("Kontrolujem existenciu pola\n");
  225. #endif
  226.     if (arrofstr == NULL){
  227.         printf("Pole nie je vytvorene\n\n");
  228.         return;
  229.     }
  230.     for (i = 0; i < n; i++){
  231.         printf("%s\n", *(arrofstr + i));
  232.     }
  233.     putchar('\n');
  234. }
  235.  
  236. void cesar(char **arrofstr, int n){
  237.     int i, j, key, flag = 1;
  238.     char buf[ARRAYSIZE], c, meno[ARRAYSIZE];
  239.     if (arrofstr == NULL){
  240.         printf("Pole nie je vytvorene\n\n");
  241.         return;
  242.     }
  243.     scanf("%s %d", buf, &key);
  244.     while (getchar() != '\n');
  245.     for (i = 0; i < n; i++){
  246.         //najdem si posledny vyskyt ciarky a hladam ci sa meno
  247.         //zhoduje s podretazcom so vracia strrchr
  248.         sscanf((strrchr(*(arrofstr + i), ' ') + 1), "%s", meno);
  249.         if (strcmp(meno, buf) != 0)
  250.             printf("%s\n", *(arrofstr + i));
  251.         else{
  252.             flag = 0;
  253.             j = 0;
  254.             while ((c = *(*(arrofstr + i) + j)) != '\0'){
  255.                 if (islower(c))
  256.                     *(*(arrofstr + i) + j) = ((c - 'a' + key) % ABECEDA + 'a');
  257.                 else if (isupper(c))
  258.                     *(*(arrofstr + i) + j) = ((c - 'A' + key) % ABECEDA + 'A');
  259.                 j++;
  260.             }
  261.             printf("%s\n", *(arrofstr + i));
  262.         }
  263.     }
  264.     if (flag){
  265.         printf("Dane meno sa v zozname nenachadza\n");
  266.     }
  267.     putchar('\n');
  268. }
  269.  
  270. void albam(char **arrofstr, int n){
  271.     int i, j, key = ABECEDA / 2, flag = 1;
  272.     char buf[ARRAYSIZE], c, meno[ARRAYSIZE];
  273.     if (arrofstr == NULL){
  274.         printf("Pole nie je vytvorene\n\n");
  275.         return;
  276.     }
  277.     scanf("%s", buf);
  278.     while (getchar() != '\n');
  279.     for (i = 0; i < n; i++){
  280.         //najdem si posledny vyskyt ciarky a hladam ci sa meno
  281.         //zhoduje s podretazcom so vracia strrchr
  282.         sscanf((strrchr(*(arrofstr + i), ' ') + 1), "%s", meno);
  283.         if (strcmp(meno, buf) != 0)
  284.             printf("%s\n", *(arrofstr + i));
  285.         else{
  286.             flag = 0;
  287.             j = 0;
  288.             while ((c = *(*(arrofstr + i) + j)) != '\0'){
  289.                 if (islower(c))
  290.                     *(*(arrofstr + i) + j) = ((c - 'a' + key) % ABECEDA + 'a');
  291.                 else if (isupper(c))
  292.                     *(*(arrofstr + i) + j) = ((c - 'A' + key) % ABECEDA + 'A');
  293.                 j++;
  294.             }
  295.             printf("%s\n", *(arrofstr + i));
  296.         }
  297.     }
  298.     if (flag){
  299.         printf("Dane meno sa v zozname nenachadza\n");
  300.     }
  301.     putchar('\n');
  302. }
  303.  
  304. /*sifrovanie kazdeho neparneho riadku pola cesarovou
  305. sifrovou cislom ktore nacitam zo STDIN*/
  306. int fcia_b(char ***arrofstr, int n){
  307.     //urcim si novy pocet riadkov
  308.     int nove_n, i, j, k, key;
  309.     //nove pole
  310.     char **nove_arrofstr, c;
  311.     scanf("%d", &key);
  312.     //ak v poli nic nie je, vyskocim z funkcie
  313.     if (*arrofstr == NULL){
  314.         printf("Pole nie je vytvorene\n\n");
  315.         return 0;
  316.     }
  317.     nove_n = n + (n / 2);
  318.     if (n % 2)
  319.         nove_n++;
  320.     //alokujem si nove pole
  321.     nove_arrofstr = (char**)malloc(nove_n * sizeof(char*));
  322.     /*prekopirujem si smerniky na riadky zo stareho do noveho
  323.     a zaroven ked je riadok neparny, tak ho zasifrujem a ulozim
  324.     do noveho riadku pod nim*/
  325.     for (i = j = k = 0; i < nove_n; i++){
  326.         if (i % 3 == 0){
  327.             *(nove_arrofstr + i) = *(*arrofstr + j);
  328.         }
  329.         if (i % 3 == 1){
  330.             *(nove_arrofstr + i) = (char*)malloc((strlen(*(*arrofstr + j)) +1) * sizeof(char));
  331.             //sifrovanie copypastnute z funkcie c
  332.             while ((c = *(*(*arrofstr + j) + k)) != '\0'){
  333.                 if (islower(c))
  334.                     *(*(nove_arrofstr + i) + k) = ((c - 'a' + key) % ABECEDA + 'a');
  335.                 else if (isupper(c))
  336.                     *(*(nove_arrofstr + i) + k) = ((c - 'A' + key) % ABECEDA + 'A');
  337.                 else
  338.                     *(*(nove_arrofstr + i) + k) = c;
  339.                 k++;
  340.             }
  341.             *(*(nove_arrofstr + i) + k) = '\0';
  342.             k = 0;
  343.             j++;
  344.         }
  345.         if (i % 3==2){
  346.             *(nove_arrofstr + i) = *(*arrofstr + j);
  347.             j++;
  348.         }
  349.     }
  350. #ifdef LADENIE
  351.     printf("%d %d\n", i, nove_n);
  352.     printf("%d %d\n", j, n);
  353.     for (i = 0; i < nove_n; i++){
  354.         printf("%s\n", *(nove_arrofstr + i));
  355.     }
  356. #endif
  357.     //uvolnit pamat
  358.     free(*arrofstr);
  359.     //presmerovat smernik na 2D pole
  360.     *arrofstr = nove_arrofstr;
  361.     putchar('\n');
  362.     while (getchar() != '\n');
  363.     return nove_n;
  364. }
  365.  
  366. /*funckia nacita cislo a urobi histogram kazdeho riadku
  367. delitelneho nacitanym cislom*/
  368. void histogram(char **arrofstr, int n){
  369.     int histogram[ABECEDA], i, j, k;
  370.     scanf("%d", &i);
  371.     if (arrofstr == NULL){
  372.         printf("Pole nie je vytvorene\n");
  373.         return;
  374.     }
  375.     //vynulovanie histogramu
  376.     for (j = 0; j < ABECEDA; j++)
  377.         histogram[j] = 0;
  378.     for (j = 0; j < n; j++){
  379.         k = 0;
  380.         //beriem iba riadok delitelny cislom i
  381.         if (!(j%i)){
  382.             while (*(*(arrofstr + j) + k) != '\0'){
  383.                 if (isalpha(*(*(arrofstr + j) + k)))
  384.                     histogram[toupper(*(*(arrofstr + j) + k)) - 'A']++;
  385.                 k++;
  386.             }
  387.         }
  388.     }
  389.     for (j = 0; j < ABECEDA; j++){
  390.         if (histogram[j])
  391.             printf("%c:%d\n", j + 'a', histogram[j]);
  392.     }
  393.     putchar('\n');
  394.     while (getchar() != '\n');
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement