Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- //#define LADENIE
- #define SUBOR "poplatky.txt"
- #define ARRAYSIZE 53
- #define ABECEDA ('Z' - 'A' + 1)
- #define islower(x) (((x)>='a' && (x)<='z')? 1:0)
- #define isupper(x) (((x)>='A' && (x)<='Z')? 1:0)
- void vypis(FILE **p_fr);
- void najpoplatky(FILE *fr);
- int nacitajstr(FILE *fr, char ***arrofstr, int polozky);
- void vypisstr(char **arrofstr, int n);
- void cesar(char **arrofstr, int n);
- void albam(char **arrofstr, int n);
- int fcia_b(char ***arrofstr, int n);
- void histogram(char **arrofstr, int n);
- int main(){
- FILE *fr = NULL;
- char volba, **arrofstr = NULL;
- int zaznamy = 0;
- while ((volba = getchar()) != 'k'){
- while (getchar() != '\n');
- switch (volba){
- case 'v': vypis(&fr); break; //vypise subor
- case 'p': najpoplatky(fr); break; //vypis najvyssieho poplatku
- case 'n': zaznamy = nacitajstr(fr, &arrofstr, zaznamy); break; //nacitanie meno priezvisko
- case 'm': vypisstr(arrofstr, zaznamy); break; //vypis meno priezvisko
- case 'c': cesar(arrofstr, zaznamy); break; //cesarova sifra
- case 'a': albam(arrofstr, zaznamy); break; //sifra albam
- case 'b': zaznamy = fcia_b(&arrofstr, zaznamy); break; //funkcia b sifruje neparne riadky
- case 'd': histogram(arrofstr, zaznamy); break; //vypise histogram riadkov delitelnych nacitanym cislom
- }
- }
- if (fr != NULL){
- if (fclose(fr) == EOF)
- printf("Subor sa nezatvoril\n");
- }
- return 0;
- }
- //fcia na vypis suboru
- void vypis(FILE **p_fr){
- char buf[ARRAYSIZE];
- #ifdef LADENIE
- printf("Otvaram subor %s!\n", SUBOR);
- #endif
- if ((*p_fr = fopen(SUBOR, "r")) == NULL){
- printf("Neotvoreny subor\n");
- return;
- }
- fgets(buf, ARRAYSIZE, *p_fr);
- while (!feof(*p_fr)){
- printf("priezvisko meno: %s", buf);
- fgets(buf, ARRAYSIZE, *p_fr);
- printf("ulica cislo: %s", buf);
- fgets(buf, ARRAYSIZE, *p_fr);
- printf("domova dan: %s", buf);
- fgets(buf, ARRAYSIZE, *p_fr);
- printf("odvoz odpadu: %s", buf);
- fgets(buf, ARRAYSIZE, *p_fr);
- printf("datum: %s\n", buf);
- fgets(buf, ARRAYSIZE, *p_fr);
- fgets(buf, ARRAYSIZE, *p_fr);
- }
- rewind(*p_fr);
- }
- //Po aktivovaní vypíše najvyššie zaplatené
- //poplatky(domova dan + odvoz odpadu) obyvateľa bývajúceho na zadanej
- //ulici zapísanú v súbore za posledný rok(t.j.najvyšší rok v súbore).
- void najpoplatky(FILE *fr){
- char buf[ARRAYSIZE], stdin_adresa[ARRAYSIZE], fr_adresa[ARRAYSIZE], dan[ARRAYSIZE], odpad[ARRAYSIZE];
- double akt_dan, akt_poplatok, max_dan = -1, max_poplatok = -1;
- int rok, najrok = 0, i, flag = 0;
- fgets(stdin_adresa, ARRAYSIZE, stdin);
- stdin_adresa[strlen(stdin_adresa) - 1] = '\0';
- #ifdef LADENIE
- printf("Kontrola suboru!\n");
- #endif
- if (fr == NULL){
- #ifdef LADENIE
- printf("Subor este neotvoreny\n");
- #endif
- return;
- }
- //najskor zistim najvyssi rok v subore
- while (!feof(fr)){
- //nacita datum ako piaty riadok zaznamu
- for (i = 0; i < 5; i++)
- fgets(buf, ARRAYSIZE, fr);
- rok = atoi(&buf[4]);
- //ulozim si najvyssi rok
- if (najrok < rok)
- najrok = rok;
- //nacitam prazdny riadok
- fgets(buf, ARRAYSIZE, fr);
- }
- rewind(fr);
- #ifdef LADENIE
- printf("Najvyssi zisteny rok: %d\n", najrok);
- #endif
- //zistim kde v subore sa este nachadza dany rok
- //a ak sa zhoduje adresa, vytlacim
- while (!feof(fr)){
- fgets(buf, ARRAYSIZE, fr);
- fgets(fr_adresa, ARRAYSIZE, fr);
- fgets(dan, ARRAYSIZE, fr);
- fgets(odpad, ARRAYSIZE, fr);
- fgets(buf, ARRAYSIZE, fr);
- rok = atoi(&buf[4]);
- if (rok == najrok){
- //ak sa mi zhoduje rok, tak z adresy zo suboru
- //orezem cislo a porovnam z adresou zo stdin
- *(strrchr(fr_adresa, ' ')) = '\0';
- if (!(strcmp(stdin_adresa, fr_adresa))){
- //ak sedi adresa tak si skonvertujem retazce s poplatkami
- //na double a porovnam s najvyssou nameranou hodnotou
- //ak to bude viac, tak to prepisem
- akt_dan = atof(dan);
- akt_poplatok = atof(odpad);
- if ((akt_dan + akt_poplatok) > (max_dan + max_poplatok)){
- max_dan = akt_dan;
- max_poplatok = akt_poplatok;
- flag = 1;
- }
- }
- }
- fgets(buf, ARRAYSIZE, fr);
- }
- if (flag)
- printf("%g\n", max_dan + max_poplatok);
- #ifdef LADENIE
- else
- printf("V najvyssom roku v subore tj. %d z ulice: %s neplatil poplatky\n", najrok, stdin_adresa);
- #endif
- rewind(fr);
- putchar('\n');
- }
- int nacitajstr(FILE *fr, char ***arrofstr, int polozky){
- int zaznamy = 0, zaznamov = 1, dlzka, i, j;
- if (fr == NULL){
- #ifdef LADENIE
- printf("Subor este neotvoreny\n");
- #endif
- return 0;
- }
- //zistim pocet riadkov
- while ((i = getc(fr)) != EOF){
- if (i == '\n')
- zaznamov++;
- }
- //zaznamov je pocet riadkov celkovo / riadky na zaznam
- zaznamov /= 6;
- //ak na nejake pole ukazujem, tak ho zmazem
- if (*arrofstr != NULL){
- for (i = 0; i < polozky; i++){
- free(*(*arrofstr + i));
- }
- free(*arrofstr);
- *arrofstr = NULL;
- }
- //vytvorim pole pointrov na retazce o velkosti poctu poloziek suboru
- *arrofstr = (char**)malloc(zaznamov * sizeof(char*));
- //kontrola alokacie pamati
- if (*arrofstr == NULL){
- printf("Malloc failed, deal with it\n");
- return 0;
- }
- rewind(fr);
- while (!feof(fr)){
- rewind(fr);
- //nastavim sa na poslednu znamu poziciu
- for (i = 0; i < zaznamy; i++){
- for (j = 0; j < 6; j++){
- while (getc(fr) != '\n');
- }
- }
- dlzka = 1;
- //zistim dlzku riadku
- while (getc(fr) != '\n')
- dlzka++;
- rewind(fr);
- //vratim sa tam odkial som zacal pocitat
- for (i = 0; i < zaznamy; i++){
- for (j = 0; j < 6; j++){
- while (getc(fr) != '\n');
- }
- }
- //vygenerujem si pole dostatocne dlhe na string
- *(*arrofstr + zaznamy) = (char*)malloc(dlzka * sizeof(char));
- //kontrola alokacie pamati
- if (*(*arrofstr + zaznamy) == NULL){
- printf("Malloc failed, deal with it\n");
- return 0;
- }
- //nacitam riadok do pola
- fgets(*(*arrofstr + zaznamy), dlzka, fr);
- #ifdef LADENIE
- printf("%s\n", *(*arrofstr + zaznamy));
- #endif
- zaznamy++;
- //idem na koniec zaznamu, aby som mohol zistit, ci je koncom suboru
- for (i = 0; i <= 6; i++){
- while ((j = getc(fr)) != '\n')
- if (j == EOF)
- break;
- }
- }
- rewind(fr);
- putchar('\n');
- return zaznamy;
- }
- void vypisstr(char **arrofstr, int n){
- int i;
- #ifdef LADENIE
- printf("Kontrolujem existenciu pola\n");
- #endif
- if (arrofstr == NULL){
- printf("Pole nie je vytvorene\n\n");
- return;
- }
- for (i = 0; i < n; i++){
- printf("%s\n", *(arrofstr + i));
- }
- putchar('\n');
- }
- void cesar(char **arrofstr, int n){
- int i, j, key, flag = 1;
- char buf[ARRAYSIZE], c, meno[ARRAYSIZE];
- if (arrofstr == NULL){
- printf("Pole nie je vytvorene\n\n");
- return;
- }
- scanf("%s %d", buf, &key);
- while (getchar() != '\n');
- for (i = 0; i < n; i++){
- //najdem si posledny vyskyt ciarky a hladam ci sa meno
- //zhoduje s podretazcom so vracia strrchr
- sscanf((strrchr(*(arrofstr + i), ' ') + 1), "%s", meno);
- if (strcmp(meno, buf) != 0)
- printf("%s\n", *(arrofstr + i));
- else{
- flag = 0;
- j = 0;
- while ((c = *(*(arrofstr + i) + j)) != '\0'){
- if (islower(c))
- *(*(arrofstr + i) + j) = ((c - 'a' + key) % ABECEDA + 'a');
- else if (isupper(c))
- *(*(arrofstr + i) + j) = ((c - 'A' + key) % ABECEDA + 'A');
- j++;
- }
- printf("%s\n", *(arrofstr + i));
- }
- }
- if (flag){
- printf("Dane meno sa v zozname nenachadza\n");
- }
- putchar('\n');
- }
- void albam(char **arrofstr, int n){
- int i, j, key = ABECEDA / 2, flag = 1;
- char buf[ARRAYSIZE], c, meno[ARRAYSIZE];
- if (arrofstr == NULL){
- printf("Pole nie je vytvorene\n\n");
- return;
- }
- scanf("%s", buf);
- while (getchar() != '\n');
- for (i = 0; i < n; i++){
- //najdem si posledny vyskyt ciarky a hladam ci sa meno
- //zhoduje s podretazcom so vracia strrchr
- sscanf((strrchr(*(arrofstr + i), ' ') + 1), "%s", meno);
- if (strcmp(meno, buf) != 0)
- printf("%s\n", *(arrofstr + i));
- else{
- flag = 0;
- j = 0;
- while ((c = *(*(arrofstr + i) + j)) != '\0'){
- if (islower(c))
- *(*(arrofstr + i) + j) = ((c - 'a' + key) % ABECEDA + 'a');
- else if (isupper(c))
- *(*(arrofstr + i) + j) = ((c - 'A' + key) % ABECEDA + 'A');
- j++;
- }
- printf("%s\n", *(arrofstr + i));
- }
- }
- if (flag){
- printf("Dane meno sa v zozname nenachadza\n");
- }
- putchar('\n');
- }
- /*sifrovanie kazdeho neparneho riadku pola cesarovou
- sifrovou cislom ktore nacitam zo STDIN*/
- int fcia_b(char ***arrofstr, int n){
- //urcim si novy pocet riadkov
- int nove_n, i, j, k, key;
- //nove pole
- char **nove_arrofstr, c;
- scanf("%d", &key);
- //ak v poli nic nie je, vyskocim z funkcie
- if (*arrofstr == NULL){
- printf("Pole nie je vytvorene\n\n");
- return 0;
- }
- nove_n = n + (n / 2);
- if (n % 2)
- nove_n++;
- //alokujem si nove pole
- nove_arrofstr = (char**)malloc(nove_n * sizeof(char*));
- /*prekopirujem si smerniky na riadky zo stareho do noveho
- a zaroven ked je riadok neparny, tak ho zasifrujem a ulozim
- do noveho riadku pod nim*/
- for (i = j = k = 0; i < nove_n; i++){
- if (i % 3 == 0){
- *(nove_arrofstr + i) = *(*arrofstr + j);
- }
- if (i % 3 == 1){
- *(nove_arrofstr + i) = (char*)malloc((strlen(*(*arrofstr + j)) +1) * sizeof(char));
- //sifrovanie copypastnute z funkcie c
- while ((c = *(*(*arrofstr + j) + k)) != '\0'){
- if (islower(c))
- *(*(nove_arrofstr + i) + k) = ((c - 'a' + key) % ABECEDA + 'a');
- else if (isupper(c))
- *(*(nove_arrofstr + i) + k) = ((c - 'A' + key) % ABECEDA + 'A');
- else
- *(*(nove_arrofstr + i) + k) = c;
- k++;
- }
- *(*(nove_arrofstr + i) + k) = '\0';
- k = 0;
- j++;
- }
- if (i % 3==2){
- *(nove_arrofstr + i) = *(*arrofstr + j);
- j++;
- }
- }
- #ifdef LADENIE
- printf("%d %d\n", i, nove_n);
- printf("%d %d\n", j, n);
- for (i = 0; i < nove_n; i++){
- printf("%s\n", *(nove_arrofstr + i));
- }
- #endif
- //uvolnit pamat
- free(*arrofstr);
- //presmerovat smernik na 2D pole
- *arrofstr = nove_arrofstr;
- putchar('\n');
- while (getchar() != '\n');
- return nove_n;
- }
- /*funckia nacita cislo a urobi histogram kazdeho riadku
- delitelneho nacitanym cislom*/
- void histogram(char **arrofstr, int n){
- int histogram[ABECEDA], i, j, k;
- scanf("%d", &i);
- if (arrofstr == NULL){
- printf("Pole nie je vytvorene\n");
- return;
- }
- //vynulovanie histogramu
- for (j = 0; j < ABECEDA; j++)
- histogram[j] = 0;
- for (j = 0; j < n; j++){
- k = 0;
- //beriem iba riadok delitelny cislom i
- if (!(j%i)){
- while (*(*(arrofstr + j) + k) != '\0'){
- if (isalpha(*(*(arrofstr + j) + k)))
- histogram[toupper(*(*(arrofstr + j) + k)) - 'A']++;
- k++;
- }
- }
- }
- for (j = 0; j < ABECEDA; j++){
- if (histogram[j])
- printf("%c:%d\n", j + 'a', histogram[j]);
- }
- putchar('\n');
- while (getchar() != '\n');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement