Facebook
From David Backham, 6 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 276
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<locale.h>
  4. #include<string.h>
  5. #include<conio.h>
  6. struct kontakt_dane
  7. {
  8.     char imie[30];
  9.     char nazwisko[30];
  10.     char numer[10];
  11.     char grupa[30];
  12. };
  13. //Strukturę – element listy, zawierający kontakt i adresy do struktur tego samego typu – elementu poprzedniego i następnego;
  14. struct element
  15. {
  16.     struct element* poprzedni;
  17.     struct element* nastepny;
  18.     struct kontakt_dane kontakt;
  19. };
  20. void wyczyscbufor()
  21. {
  22.     int c;
  23.     while (((c = getc(stdin)) != 'n') && (c != EOF));
  24. }
  25. //Funkcje wczytującą kontakty z pliku .CSV i formującą listę.
  26. /*
  27. Dynamiczna struktura danych, gdzie każdy element listy przechowuje odniesienie
  28. (adres) zarówno do poprzedzającego jak i następnego elementu. Taka relacja
  29. pozwala na swobodne przemieszczanie się na liście w obu kierunkach
  30. void wczytywanie_z_pliku(struct element** poczatek,struct element** gora)
  31. */
  32. void wczytywanie_z_pliku(struct element** poczatek, struct element** gora)
  33. {
  34.     FILE* plik;
  35.     char* nazwa_pliku;
  36.     struct element* osoba;
  37.     struct element* poprzedni;
  38.     poprzedni = calloc(1, sizeof(struct element));
  39.     nazwa_pliku = calloc(20, sizeof(char));
  40.     while (1)
  41.     {
  42.         printf("Podaj nazwe pliku:n");
  43.         scanf("%s", nazwa_pliku);
  44.         plik = fopen(nazwa_pliku, "r");
  45.         if (plik == NULL)
  46.         {
  47.             printf("Podano zla nazwe pliku. Sprobuj ponownie.n");
  48.             wyczyscbufor();
  49.         }
  50.         else
  51.         {
  52.             break;
  53.         }
  54.     }
  55.     while (feof(plik) == 0)
  56.     {
  57.         osoba = calloc(1, sizeof(struct element));
  58.         fscanf(plik, "%[^;] ; %[^;] ; %[^;] ; %sn", osoba->kontakt.imie, osoba->kontakt.nazwisko, osoba->kontakt.numer, osoba->kontakt.grupa);
  59.         if (*poczatek != NULL)
  60.         {
  61.             osoba->poprzedni = poprzedni;
  62.             osoba->poprzedni->nastepny = osoba;
  63.             osoba->nastepny = NULL;
  64.             poprzedni = osoba;
  65.             *gora = osoba;
  66.         }
  67.         if (*poczatek == NULL)
  68.         {
  69.             osoba->poprzedni = NULL;
  70.             osoba->nastepny = NULL;
  71.             poprzedni = osoba;
  72.             *poczatek = osoba;
  73.         }
  74.     }
  75.     fclose(plik);
  76. }
  77. void wyswietlanie_kontatkow(struct element* poczatek)
  78. {
  79.     struct element* aktualny;
  80.     int i = 1;
  81.     aktualny = calloc(1, sizeof(aktualny));
  82.     aktualny = poczatek;
  83.     printf("Ksiazka telefoniczna:n");
  84.     while (aktualny != NULL)
  85.     {
  86.         printf("%d)%s %s %s %sn", i, aktualny->kontakt.imie, aktualny->kontakt.nazwisko, aktualny->kontakt.numer, aktualny->kontakt.grupa);
  87.         aktualny = aktualny->nastepny;
  88.         i++;
  89.     }
  90.     free(aktualny);
  91. }
  92. void sortowanie(struct element** poczatek,struct element** gora, int sort)
  93. {
  94.     struct element* aktualny;
  95.     int zmiana = 1;
  96.     aktualny = calloc(1, sizeof(struct element));
  97.     aktualny = *poczatek;
  98.     if(sort==1)
  99.     {
  100.         while (zmiana != 0)
  101.         {
  102.             zmiana = 0;
  103.             while ((*aktualny).nastepny != NULL)
  104.             {
  105.                 if (strcoll((*aktualny).kontakt.imie, (*aktualny).nastepny->kontakt.imie) == 1)
  106.                 //Jeden jeśli pierwszy ciąg znaków jest niżej według kolejności alfabetycznej niż drugi.
  107.                 {
  108.                     zmiana += 1;
  109.                     if ((*aktualny).poprzedni != NULL && (*aktualny).nastepny != NULL)
  110.                     {
  111.                         /*
  112.                         Między dwoma elementami oraz elementami
  113.                         sąsiadującymi z nimi występuje do sześciu „powiązań” adresów, stąd algorytm
  114.                         zamiany dwóch elementów składa się z sześciu „podmian” adresów.
  115.                         Należy zwrócić uwagę na możliwość wzięcia udziału w zamianie skrajnych elementów, (przy zamianach
  116.                         pierwszy z drugim lub ostatni z przedostatnim), które wskazują na NULL.
  117.                         */
  118.                         (*aktualny).poprzedni->nastepny = (*aktualny).nastepny;
  119.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  120.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  121.                         (*aktualny).nastepny = (*aktualny).poprzedni->nastepny;
  122.                         (*aktualny).poprzedni->nastepny = aktualny;
  123.                         if ((*aktualny).nastepny != NULL)
  124.                         {
  125.                             (*aktualny).nastepny->poprzedni = aktualny;
  126.                         }
  127.                         else
  128.                         {
  129.                             (*aktualny).nastepny = NULL;
  130.                             *gora = aktualny;
  131.                              /* zastosowanie, aby program nie myslal, ze gora to ciagle
  132.                              ten sam element, ktory byl uzywany na poczatku */
  133.                         }
  134.                     }
  135.                     if ((*aktualny).poprzedni == NULL)
  136.                     {
  137.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  138.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  139.                         if ((*aktualny).nastepny->nastepny != NULL)
  140.                         {
  141.                             (*aktualny).nastepny = (*aktualny).nastepny->nastepny;
  142.                             (*aktualny).nastepny->poprzedni = aktualny;
  143.                         }
  144.                         else
  145.                         {
  146.                             (*aktualny).nastepny = NULL;
  147.                         }
  148.                         (*aktualny).poprzedni->nastepny = aktualny;
  149.                         *poczatek = aktualny->poprzedni;
  150.                     }
  151.                 }
  152.                 else
  153.                 {
  154.                     aktualny = aktualny->nastepny;
  155.                 }
  156.             }
  157.             aktualny = *poczatek;
  158.         }
  159.         printf("Posortowano wedlug imion.n");
  160.     }
  161.     if(sort == 2)
  162.     {
  163.         while (zmiana != 0)
  164.         {
  165.             zmiana = 0;
  166.             while ((*aktualny).nastepny != NULL)
  167.             {
  168.                 if (strcoll((*aktualny).kontakt.nazwisko, (*aktualny).nastepny->kontakt.nazwisko) == 1)
  169.                 {
  170.                     zmiana += 1;
  171.                     if ((*aktualny).poprzedni != NULL && (*aktualny).nastepny != NULL)
  172.                     {
  173.                         (*aktualny).poprzedni->nastepny = (*aktualny).nastepny;
  174.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  175.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  176.                         (*aktualny).nastepny = (*aktualny).poprzedni->nastepny;
  177.                         (*aktualny).poprzedni->nastepny = aktualny;
  178.                         if ((*aktualny).nastepny != NULL)
  179.                         {
  180.                             (*aktualny).nastepny->poprzedni = aktualny;
  181.                         }
  182.                         else
  183.                         {
  184.                             (*aktualny).nastepny = NULL;
  185.                             *gora = aktualny;
  186.                         }
  187.                     }
  188.                     if ((*aktualny).poprzedni == NULL)
  189.                     {
  190.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  191.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  192.                         if ((*aktualny).nastepny->nastepny != NULL)
  193.                         {
  194.                             (*aktualny).nastepny = (*aktualny).nastepny->nastepny;
  195.                             (*aktualny).nastepny->poprzedni = aktualny;
  196.                         }
  197.                         else
  198.                         {
  199.                             (*aktualny).nastepny = NULL;
  200.                         }
  201.                         (*aktualny).poprzedni->nastepny = aktualny;
  202.                         *poczatek = aktualny->poprzedni;
  203.                     }
  204.                 }
  205.                 else
  206.                 {
  207.                     aktualny = aktualny->nastepny;
  208.                 }
  209.             }
  210.             aktualny = *poczatek;
  211.         }
  212.         printf("Posortowano wedlug nazwisk.n");
  213.     }
  214.     if(sort == 3)
  215.     {
  216.         while (zmiana != 0)
  217.         {
  218.             zmiana = 0;
  219.             while ((*aktualny).nastepny != NULL)
  220.             {
  221.                 if (strcoll((*aktualny).kontakt.grupa, (*aktualny).nastepny->kontakt.grupa) == 1)
  222.                 {
  223.                     zmiana += 1;
  224.                     if ((*aktualny).poprzedni != NULL && (*aktualny).nastepny != NULL)
  225.                     {
  226.                         (*aktualny).poprzedni->nastepny = (*aktualny).nastepny;
  227.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  228.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  229.                         (*aktualny).nastepny = (*aktualny).poprzedni->nastepny;
  230.                         (*aktualny).poprzedni->nastepny = aktualny;
  231.                         if ((*aktualny).nastepny != NULL)
  232.                         {
  233.                             (*aktualny).nastepny->poprzedni = aktualny;
  234.                         }
  235.                         else
  236.                         {
  237.                             (*aktualny).nastepny = NULL;
  238.                             *gora = aktualny;
  239.                         }
  240.                     }
  241.                     if ((*aktualny).poprzedni == NULL)
  242.                     {
  243.                         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  244.                         (*aktualny).poprzedni = (*aktualny).nastepny;
  245.                         if ((*aktualny).nastepny->nastepny != NULL)
  246.                         {
  247.                             (*aktualny).nastepny = (*aktualny).nastepny->nastepny;
  248.                             (*aktualny).nastepny->poprzedni = aktualny;
  249.                         }
  250.                         else
  251.                         {
  252.                             (*aktualny).nastepny = NULL;
  253.                         }
  254.                         (*aktualny).poprzedni->nastepny = aktualny;
  255.                         *poczatek = aktualny->poprzedni;
  256.                     }
  257.                 }
  258.                 else
  259.                 {
  260.                     aktualny = aktualny->nastepny;
  261.                 }
  262.             }
  263.             aktualny = *poczatek;
  264.         }
  265.         printf("Posortowano wedlug grup.n");
  266.     }
  267. }
  268. void dodawanie_kontaktu(struct element** gora)
  269. {
  270.     struct element* nowy;
  271.     nowy = calloc(1, sizeof(struct element));
  272.     printf("Podaj imie, nazwisko, numer_telefonu i grupe (oddzielona spacjami):n");
  273.     scanf("%s %s %s %s", nowy->kontakt.imie, nowy->kontakt.nazwisko, nowy->kontakt.numer, nowy->kontakt.grupa);
  274.     nowy->poprzedni = (*gora);
  275.     nowy->nastepny = NULL;
  276.     (*gora)->nastepny = nowy;
  277.     (*gora) = nowy;
  278. }
  279. void wyszukiwanie_kontaktu(struct element* poczatek, int opcja)
  280. {
  281.     char* tab;
  282.     char* wyraz;
  283.     char* wyraz2;
  284.     int i = 0;
  285.     int j;
  286.     int numer = 1;
  287.     struct element* aktualny;
  288.     aktualny = calloc(1, sizeof(struct element));
  289.     tab = calloc(30, sizeof(char));
  290.     wyraz = calloc(30, sizeof(char));
  291.     wyraz2 = calloc(30, sizeof(char));
  292.     *(wyraz) = _getch();
  293.     *wyraz2 = *wyraz;
  294.     while (*(wyraz + i) != 32)
  295.     {
  296.         printf("Aby zakonczyn wyszukiwanie kliknij spacjen");
  297.         aktualny = poczatek;
  298.         if (*(wyraz + i) == 8 && i > 0)
  299.         {
  300.             *(wyraz + i) = '�';
  301.             *(wyraz + i - 1) = '�';
  302.             *(wyraz2 + i) = '�';
  303.             *(wyraz2 + i - 1) = '�';
  304.             i -= 2;
  305.         }
  306.         if (*(wyraz + i) > 64 && *(wyraz + i) < 91)
  307.         {
  308.             *(wyraz + i) = *(wyraz + i) + 32;
  309.         }
  310.         while (aktualny != NULL)
  311.         {
  312.             if (opcja == 1)
  313.             {
  314.                 for (j = 0; j < sizeof(aktualny->kontakt.imie)/sizeof(char); j++)
  315.                 {
  316.                     if (aktualny->kontakt.imie[j] > 64 && aktualny->kontakt.imie[j] < 91)
  317.                     {
  318.                         aktualny->kontakt.imie[j] = aktualny->kontakt.imie[j] + 32;
  319.                     }
  320.                 }
  321.                 tab = strstr(aktualny->kontakt.imie, wyraz);
  322.                             /*Jeśli fragment zostanie znaleziony - tablicę znaków ( char * ) będącą częścią str1 od pierwszego
  323.                              wystąpienia str2 w str1, np. dla:
  324.                              char* tab;
  325.                              tab = strstr( "Alamakota", "ama" );
  326.                              tab przyjmie wartość "amakota".
  327.                              - Jeśli fragment nie zostanie znaleziony – NULL;*/
  328.                 aktualny->kontakt.imie[0] = aktualny->kontakt.imie[0] - 32;
  329.                 if (tab != NULL)
  330.                 {
  331.                     printf("%d)%s %s %s %sn", numer, aktualny->kontakt.imie, aktualny->kontakt.nazwisko, aktualny->kontakt.numer, aktualny->kontakt.grupa);
  332.                     numer += 1;
  333.                 }
  334.             }
  335.             if (opcja == 2)
  336.             {
  337.                 for (j = 0; j < sizeof(aktualny->kontakt.nazwisko) / sizeof(char); j++)
  338.                 {
  339.                     if (aktualny->kontakt.nazwisko[j] > 64 && aktualny->kontakt.nazwisko[j] < 91)
  340.                     {
  341.                         aktualny->kontakt.nazwisko[j] = aktualny->kontakt.nazwisko[j] + 32;
  342.                     }
  343.                 }
  344.                 tab = strstr(aktualny->kontakt.nazwisko, wyraz);
  345.                 aktualny->kontakt.nazwisko[0] = aktualny->kontakt.nazwisko[0] - 32;
  346.                 if (tab != NULL)
  347.                 {
  348.                     printf("%d)%s %s %s %sn", numer, aktualny->kontakt.imie, aktualny->kontakt.nazwisko, aktualny->kontakt.numer, aktualny->kontakt.grupa);
  349.                     numer += 1;
  350.                 }
  351.             }
  352.             if (opcja == 3)
  353.             {
  354.                 for (j = 0; j < sizeof(aktualny->kontakt.grupa) / sizeof(char); j++)
  355.                 {
  356.                     if (aktualny->kontakt.grupa[j] > 64 && aktualny->kontakt.grupa[j] < 91)
  357.                     {
  358.                         aktualny->kontakt.grupa[j] = aktualny->kontakt.grupa[j] + 32;
  359.                     }
  360.                 }
  361.                 tab = strstr(aktualny->kontakt.grupa, wyraz);
  362.                 if (tab != NULL)
  363.                 {
  364.                     printf("%d)%s %s %s %sn", numer, aktualny->kontakt.imie, aktualny->kontakt.nazwisko, aktualny->kontakt.numer, aktualny->kontakt.grupa);
  365.                     numer += 1;
  366.                 }
  367.             }
  368.             aktualny = aktualny->nastepny;
  369.         }
  370.         numer = 1;
  371.         i += 1;
  372.         printf("%s", wyraz2);
  373.         *(wyraz + i) = _getch();
  374.         *(wyraz2 + i) = *(wyraz + i);
  375.         system("cls");
  376.     }
  377.     free(aktualny);
  378.     free(wyraz);
  379.     free(wyraz2);
  380. }
  381. void usuwanie_kontaktu(struct element** poczatek, int numer,struct element** gora)
  382. {
  383.     struct element* aktualny;
  384.     int i;
  385.     aktualny = calloc(1, sizeof(struct element));
  386.     aktualny = *poczatek;
  387.     for (i = 0; i < numer - 1; i++)
  388.     {
  389.         aktualny = aktualny->nastepny;
  390.         if (aktualny == NULL)
  391.         {
  392.             printf("Podano zly numer.n");
  393.             return;
  394.         }
  395.     }
  396.     if ((*aktualny).nastepny != NULL && (*aktualny).poprzedni != NULL)
  397.     {
  398.         (*aktualny).poprzedni->nastepny = (*aktualny).nastepny;
  399.         (*aktualny).nastepny->poprzedni = (*aktualny).poprzedni;
  400.     }
  401.     if ((*aktualny).poprzedni == NULL && (*aktualny).nastepny == NULL) *poczatek=NULL;
  402.     else
  403.     {
  404.         if ((*aktualny).poprzedni == NULL)
  405.         {
  406.             (*aktualny).nastepny->poprzedni = NULL;
  407.             *poczatek = aktualny->nastepny;
  408.         }
  409.         if ((*aktualny).nastepny == NULL)
  410.         {
  411.             (*aktualny).poprzedni->nastepny = NULL;
  412.             *gora = aktualny->poprzedni;
  413.         }
  414.     }
  415.     free(aktualny);
  416. }
  417. void czyszczenie(struct element** poczatek, struct element**gora)
  418. {
  419.     while ((*poczatek)->nastepny != NULL)
  420.     {
  421.         usuwanie_kontaktu(poczatek,1,gora);
  422.     }
  423.     free(*poczatek);
  424. }
  425.  
  426. int main()
  427. {
  428.     struct element* poczatek = NULL;
  429.     struct element* gora = NULL;
  430.     int x = 0;
  431.     int sort = 0;
  432.     int opcja = 0;
  433.     int numer = 0;
  434.     setlocale(LC_ALL, "polish_poland");
  435.     printf("Witaj w programie ksiazki telefonicznej.n");
  436.     while (x != 7)
  437.     {
  438.         printf("Menu:n");
  439.         printf("1)Wczytywanie ksiazki.n");
  440.         printf("2)Wyswietlanie ksiazki.n");
  441.         printf("3)Sortowanie kontaktow.n");
  442.         printf("4)Dodawanie kontaktow.n");
  443.         printf("5)Wyszukiwanie kontatkow.n");
  444.         printf("6)Usuwanie kontaktow.n");
  445.         printf("7)Zakonczenie programu.n");
  446.         if ((scanf("%d", &x) == 1) && x > 0 && x < 8)
  447.         {
  448.             switch (x)
  449.             {
  450.             case 1:
  451.                 wyczyscbufor();
  452.                 system("cls");
  453.                 wczytywanie_z_pliku(&poczatek,&gora);
  454.                 printf("Pomyslnie wczytano ksiazke.n");
  455.                 break;
  456.             case 2:
  457.                 wyczyscbufor();
  458.                 system("cls");
  459.                 if (poczatek == NULL)
  460.                 {
  461.                     printf("Nie ma wczytanej zadnej ksiazki.n");
  462.  
  463.                 }
  464.                 else
  465.                 {
  466.                     wyswietlanie_kontatkow(poczatek);
  467.                     printf("n");
  468.                 }
  469.                 break;
  470.             case 3:
  471.                 wyczyscbufor();
  472.                 while (1)
  473.                 {
  474.                     system("cls");
  475.                     if (poczatek == NULL)
  476.                     {
  477.                         printf("Nie ma wczytanej zadnej ksiazki.n");
  478.                         break;
  479.  
  480.                     }
  481.                     else
  482.                     {
  483.                         printf("Podaj ktore opcje sortowania chcesz wykoanc.n");
  484.                         printf("1)Sortowanie alfabtetyczne imion.n");
  485.                         printf("2)Sortowanie alfabetyczne nazwisk.n");
  486.                         printf("3)Sortowanie alfabetyczne grup.n");
  487.                         if (scanf("%d", &sort) == 1 && sort > 0 && sort < 4)
  488.                         {
  489.                             wyczyscbufor();
  490.                             system("cls");
  491.                             sortowanie(&poczatek,&gora, sort);
  492.                             break;
  493.                         }
  494.                         else
  495.                         {
  496.                             printf("Podano zla opcje. Sprobuj ponownien");
  497.                         }
  498.                     }
  499.                 }
  500.                 break;
  501.             case 4:
  502.                 wyczyscbufor();
  503.                 system("cls");
  504.                 if (poczatek == NULL)
  505.                 {
  506.                     printf("Nie ma wczytanej zadnej ksiazki.n");
  507.  
  508.                 }
  509.                 else
  510.                 {
  511.                     dodawanie_kontaktu(&gora);
  512.                     sortowanie(&poczatek,&gora, sort);
  513.                     printf("n");
  514.                     printf("Dodano pomyslnie kontakt.n");
  515.                 }
  516.                 break;
  517.             case 5:
  518.                 wyczyscbufor();
  519.                 system("cls");
  520.                 if (poczatek == NULL)
  521.                 {
  522.                     printf("Nie ma wczytanej zadnej ksiazki.n");
  523.  
  524.                 }
  525.                 else
  526.                 {
  527.                     while (1)
  528.                     {
  529.                         printf("Podaj ktora opcje chcesz wybrac:n");
  530.                         printf("1)Wyszukiwanie po imieniu.n");
  531.                         printf("2)Wyszukiwanie po nazwisku.n");
  532.                         printf("3)Wyszukiwanie po grupie.n");
  533.                         if (scanf("%d", &opcja) == 1 && opcja > 0 && opcja < 4)
  534.                         {
  535.                             wyczyscbufor();
  536.                             system("cls");
  537.                             wyszukiwanie_kontaktu(poczatek, opcja);
  538.                             break;
  539.                         }
  540.                         else
  541.                         {
  542.                             wyczyscbufor();
  543.                             system("cls");
  544.                             printf("Podano zla opcje. Sprobuj ponownie.n");
  545.  
  546.                         }
  547.                     }
  548.                 }
  549.                 break;
  550.             case 6:
  551.                 wyczyscbufor();
  552.                 system("cls");
  553.                 while (1)
  554.                 {
  555.                     if (poczatek == NULL)
  556.                     {
  557.                         printf("Nie ma wczytanej zadnej ksiazki.nn");
  558.                         break;
  559.  
  560.                     }
  561.                     else
  562.                     {
  563.                         wyswietlanie_kontatkow(poczatek);
  564.                         printf("Podaj ktory kontakt chcesz usunac:n");
  565.                         if (scanf("%d", &numer) == 1 && numer > 0)
  566.                         {
  567.                             wyczyscbufor();
  568.                             system("cls");
  569.                             usuwanie_kontaktu(&poczatek, numer,&gora);
  570.                             printf("Kontkat zostal usuniety pomyslnie.n");
  571.                             break;
  572.                         }
  573.                         else
  574.                         {
  575.                             wyczyscbufor();
  576.                             system("cls");
  577.                             printf("Podano zly numer.n");
  578.  
  579.                         }
  580.  
  581.                     }
  582.                 }
  583.                 break;
  584.             case 7:
  585.                 wyczyscbufor();
  586.                 system("cls");
  587.                 if (poczatek != NULL)
  588.                 {
  589.                     czyszczenie(&poczatek,&gora);
  590.                     printf("Wyczyszczono kontaktyn");
  591.                 }
  592.                 break;
  593.             }
  594.         }
  595.         else
  596.         {
  597.             wyczyscbufor();
  598.             system("cls");
  599.             printf("Podano zla opcje. Sprobuj jeszcze raz.n");
  600.         }
  601.     }
  602.     printf("Koniec programu.n");
  603. }
  604.