Advertisement
Gormit

zapisywanie_listy_do_json

Jun 8th, 2020
1,195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h> //funkcja strlen
  3. #include <stdlib.h>
  4. #include <Windows.h>
  5. #pragma warning( disable : 4996 )
  6.  
  7.  
  8. struct historia* glowa = NULL, * wsk = NULL;
  9. void zapisywanie(char* przed_konw, char* po_konw);
  10.  
  11.  
  12. int menu() {
  13.     //A - HEX
  14.     //B - BIN
  15.     //C - OCT
  16.     //D - DEC
  17.     int choice;
  18.     printf("1. Konwersja z A -> B (HEX -> BIN)");
  19.     printf("\n2. Konwersja z B -> A (BIN -> HEX)");
  20.     printf("\n3. Konwersja z C -> D (OCT -> DEC)");
  21.     printf("\n4. Konwersja z D -> C (DEC -> OCT)");
  22.     printf("\n5. Historia operacji ");
  23.     printf("\n6. Zakoncz program \n");
  24.     printf("\nWybierz opcje: ");
  25.     scanf_s("%d", &choice);
  26.     return choice;
  27. }
  28.  
  29. void decToSmth(int* n, char* h, int x) {
  30.  
  31.     int temp = 0;
  32.     int i = 0;
  33.     char tab_pom[50];
  34.     for (i; *n != 0; *n /= x) //dopoki nie skonczy
  35.     {
  36.         temp = *n % x;
  37.         if (temp < 10) {
  38.             tab_pom[i] = *(h + i) = temp + 48;
  39.             i++;
  40.         }
  41.         else {
  42.             tab_pom[i] = *(h + i) = temp + 55;
  43.  
  44.             i++;
  45.         }
  46.  
  47.     }
  48.  
  49.     //zmieni� kolejno�� char
  50.     printf("Liczba w wybranym systemie to: ");
  51.     for (int j = i - 1, k = 0; j >= 0, k <= i - 1; j--, k++) {
  52.         *(h + k) = tab_pom[j]; //zmiana kolejnosci tablicy
  53.  
  54.     }
  55.     for (int j = 0; j < i; j++)
  56.         printf("%c", *(h + j));
  57.  
  58. }
  59.  
  60. int numberToDec(char* n, int dl, int x, int l) {
  61.     int base = 1; //tu b�dzie mno�nik (dla oct: 8*8... dla hex: 16*16...)
  62.     int decimal = 0;
  63.  
  64.     for (int i = dl - 1; i >= 0; i--) {
  65.         if (*(n + i) >= '0' && *(n + i) <= '9') {
  66.             decimal += (*(n + i) - 48) * base; // kod ascii liczby 0 to 48, st�d odejmujemy 48
  67.             base *= x;
  68.         }
  69.         else if (*(n + i) >= 'A' && *(n + i) <= 'F') {
  70.             decimal += (*(n + i) - 55) * base; // kod ascii litery A (10 w hex) to 65, st�d odejmujemy 55
  71.             base *= x;
  72.         }
  73.         else if (*(n + i) >= 'a' && *(n + i) <= 'f') // kod ascii litery a (10 w hex) to 97, st�d odejmujemy 87
  74.         {
  75.             decimal += (*(n + i) - 87) * base;
  76.             base *= x;
  77.         }
  78.     }
  79.     return decimal;
  80. }
  81.  
  82. struct historia {
  83.     char przed_konwersja[50];
  84.     char po_konwersji[50];
  85.     struct historia* nastepny;
  86.     struct historia* poprzedni;
  87. };
  88.  
  89. char hex[50], oct[50], bin[50], dec_tab[50];
  90.  
  91. void ZapiszDoPliku(struct historia* glowa, const char* nazwaPliku) {
  92.     FILE* out;
  93.     // jezeli udalo sie poprawnie otworzyc/utworzyc plik o podanej nazwie
  94.     if (fopen_s(&out, nazwaPliku, "w+") == 0 && out != NULL) {
  95.         fprintf(out, "{\n");
  96.         fprintf(out, "\t\"historia_zapisow\" : {\n");
  97.  
  98.         int numer = 1;
  99.         while (glowa) {
  100.             fprintf(out, "\t\t\"zapis%d\" : {\n", numer);
  101.             fprintf(out, "\t\t\t\"konwertowana\" : \"%s\",\n", glowa->przed_konwersja);
  102.             fprintf(out, "\t\t\t\"wartosc\" : \"%s\"\n", glowa->po_konwersji);
  103.             fprintf(out, "\t\t}");
  104.             if (glowa->nastepny != NULL) fprintf(out, ",\n");
  105.             else fprintf(out, "\n");
  106.             glowa = glowa->nastepny;
  107.             numer++;
  108.         }
  109.         fprintf(out, "\t}\n");
  110.         fprintf(out, "}\n");
  111.     }
  112.     // w przeciwnym razie powiadom o bledzie
  113.     else printf("blad podczas otwierania pliku do zapisu. zapisanie historii sie nie powiodlo.\n");
  114. }
  115.  
  116. int main() {
  117.     int licznik = 0;
  118.     int hex_dl, oct_dl, bin_dl, dec_dl;
  119.     int dec;
  120.     int* ptr_dec = &dec;
  121.     int limit = 2147483647 - 75060;
  122.     short int choice = 0;
  123.  
  124.     char* check; //zmienna potrzebna do sprawdzenia poprawno�ci danych
  125.     while (TRUE) {
  126.         system("cls");
  127.         choice = menu(); //wyswietlanie menu
  128.         if (licznik == 10 && choice != 5 && choice != 6) {
  129.             system("cls");
  130.             printf("Nie mozna dodac wiecej elementow !\n");
  131.             Sleep(1000);
  132.             system("cls");
  133.             continue;
  134.         }
  135.         switch (choice) //wyb�r opcji
  136.         {
  137.         case 1:
  138.             printf("\nWpisz prosze liczbe w systemie szesnastkowym: ");
  139.             scanf_s("%50s", hex, 50);
  140.             *ptr_dec = strtol(hex, &check, 16); //funkcja sprawdzaj�ca poprawno�c danych dla danego systemu
  141.             if (*check) //je�li zmienna check b�dzie mia�a warto�� (jest niepusta), to znaczy �e dane s� nieprawid�owe
  142.             {
  143.                 printf("\nPodano nieprawidlowa wartosc");
  144.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  145.                 Sleep(1000);
  146.                 continue;
  147.             }
  148.             if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci si� w limicie i nie jest naturalna
  149.             {
  150.                 printf("Liczba jest za duza, badz jest ujemna!");
  151.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  152.                 Sleep(1000);
  153.                 continue;
  154.             }
  155.             hex_dl = strlen(hex); //pobiera dlugosc ci�gu znak�w
  156.             *ptr_dec = numberToDec(hex, hex_dl, 16, limit); //konwersja liczby na dziesi�tn�
  157.             decToSmth(ptr_dec, bin, 2);
  158.             zapisywanie(hex, bin);
  159.             licznik++;
  160.             printf("\n\n");
  161.             system("PAUSE");
  162.             system("cls");
  163.             break;
  164.         case 2:
  165.             printf("\nWpisz prosze liczbe w systemie binarnym: ");
  166.             scanf_s("%50s", bin, 50);
  167.             *ptr_dec = strtol(bin, &check, 2); //funkcja sprawdzaj�ca poprawno�c danych dla danego systemu
  168.             if (*check) //je�li zmienna check b�dzie mia�a warto�� (jest niepusta), to znaczy �e dane s� nieprawid�owe
  169.             {
  170.                 printf("\nPodano nieprawidlowa wartosc");
  171.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  172.                 Sleep(1000);
  173.                 continue;
  174.             }
  175.             if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci si� w limicie i nie jest naturalna
  176.             {
  177.                 printf("Liczba jest za duza, badz jest ujemna!");
  178.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  179.                 Sleep(1000);
  180.                 continue;
  181.             }
  182.             bin_dl = strlen(bin); //pobiera dlugosc ci�gu znak�w
  183.             *ptr_dec = numberToDec(bin, bin_dl, 2, limit); //konwersja liczby na dziesi�tn�
  184.             decToSmth(ptr_dec, hex, 16);
  185.             zapisywanie(bin, hex);
  186.             licznik++;
  187.             printf("\n\n");
  188.             system("PAUSE");
  189.             system("cls");
  190.             break;
  191.         case 3:
  192.             printf("\nWpisz prosze liczbe w systemie osemkowym: ");
  193.  
  194.             scanf_s("%50s", oct, 50);
  195.             *ptr_dec = strtol(oct, &check, 8); //funkcja sprawdzaj�ca poprawno�c danych dla danego systemu
  196.             if (*check) //je�li zmienna check b�dzie mia�a warto�� (jest niepusta), to znaczy �e dane s� nieprawid�owe
  197.             {
  198.                 printf("\nPodano nieprawidlowa wartosc");
  199.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  200.                 Sleep(1000);
  201.                 continue;
  202.             }
  203.             if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci si� w limicie i nie jest naturalna
  204.             {
  205.                 printf("Liczba jest za duza, badz jest ujemna!");
  206.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  207.                 Sleep(1000);
  208.                 continue;
  209.             }
  210.             oct_dl = strlen(oct); //pobiera dlugosc ci�gu znak�w
  211.             *ptr_dec = numberToDec(oct, oct_dl, 8, limit); //konwersja liczby na dziesi�tn�
  212.             decToSmth(ptr_dec, dec_tab, 10);
  213.             zapisywanie(oct, dec_tab);
  214.             licznik++;
  215.             printf("\n\n");
  216.             system("PAUSE");
  217.             system("cls");
  218.             break;
  219.         case 4:
  220.             printf("\nWpisz prosze liczbe w systemie dziesietnym: ");
  221.  
  222.             scanf_s("%50s", dec_tab, 50);
  223.             *ptr_dec = strtol(dec_tab, &check, 10); //funkcja sprawdzaj�ca poprawno�c danych dla danego systemu
  224.             if (*check) //je�li zmienna check b�dzie mia�a warto�� (jest niepusta), to znaczy �e dane s� nieprawid�owe
  225.             {
  226.                 printf("\nPodano nieprawidlowa wartosc");
  227.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  228.                 Sleep(1000);
  229.                 continue;
  230.             }
  231.             if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci si� w limicie i nie jest naturalna
  232.             {
  233.                 printf("Liczba jest za duza, badz jest ujemna!");
  234.                 while (getchar() != '\n') {} //"czyszczenie" bufora
  235.                 Sleep(1000);
  236.                 continue;
  237.             }
  238.             dec_dl = strlen(dec_tab); //pobiera dlugosc ci�gu znak�w
  239.             *ptr_dec = numberToDec(dec_tab, dec_dl, 10, limit); //konwersja liczby na dziesi�tn� (forma int)
  240.             decToSmth(ptr_dec, oct, 8);
  241.             zapisywanie(dec_tab, oct);
  242.             licznik++;
  243.             printf("\n\n");
  244.             system("PAUSE");
  245.             system("cls");
  246.             break;
  247.         case 5:
  248.             int wybor;
  249.             wsk = glowa;
  250.             if (wsk != NULL) {
  251.                 while (wsk->nastepny != NULL) {
  252.                     wsk = wsk->nastepny;
  253.                 }
  254.                 system("cls");
  255.                 printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji);
  256.                 while (1) {
  257.                     printf("Co chcesz zrobic ?\nPoprzednia konwersja (1)\tNastepna konwersja (2)\t\tUsun(3)\t\tWyjdz (4)\n\n");
  258.                     printf("Twoj wybor:\t");
  259.                     while (scanf_s("%d", &wybor) != 1 || wybor < 1 || wybor > 4 || getchar() != '\n') {
  260.                         system("cls");
  261.                         printf("Nie ma takiej opcji. Sprobuj ponownie !\n");
  262.                         while (getchar() != '\n') {}
  263.                         printf("Co chcesz zrobic ?\nPoprzednia konwersja (1)\tNastepna konwersja (2)\t\tUsun(3)\t\tWyjdz (4)\n\n");
  264.                         printf("Twoj wybor:\t");
  265.                     }
  266.                     if (wybor == 1) {
  267.                         if (wsk->poprzedni != NULL) {
  268.                             wsk = wsk->poprzedni;
  269.                             system("cls");
  270.                             printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji);
  271.                         }
  272.                         else {
  273.                             system("cls");
  274.                             printf("Nie ma poprzedniego elementu !\n\n");
  275.                             Sleep(1000);
  276.                             system("cls");
  277.                             printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji);
  278.                         }
  279.                     }
  280.                     else if (wybor == 2) {
  281.                         if (wsk->nastepny != NULL) {
  282.                             wsk = wsk->nastepny;
  283.                             system("cls");
  284.                             printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji);
  285.                         }
  286.                         else {
  287.                             system("cls");
  288.                             printf("Nie ma nastepnego elementu !");
  289.                             Sleep(1000);
  290.                             system("cls");
  291.                             printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji);
  292.                         }
  293.                     }
  294.                     else if (wybor == 3) {
  295.                         if (wsk->poprzedni == NULL && wsk->nastepny == NULL) {
  296.                             free(wsk);
  297.                             glowa = NULL;
  298.                         }
  299.                         else if (wsk->poprzedni == NULL && wsk->nastepny != NULL) {
  300.                             glowa = glowa->nastepny;
  301.                             glowa->poprzedni = NULL;
  302.                             free(wsk);
  303.                         }
  304.                         else if (wsk->nastepny == NULL) {
  305.                             wsk->poprzedni->nastepny = NULL;
  306.                             free(wsk);
  307.                         }
  308.                         else {
  309.                             wsk->poprzedni->nastepny = wsk->nastepny;
  310.                             wsk->nastepny->poprzedni = wsk->poprzedni;
  311.                             free(wsk);
  312.                         }
  313.                         licznik--;
  314.                         system("cls");
  315.                         break;
  316.                     }
  317.                     else {
  318.                         system("cls");
  319.                         break;
  320.                     }
  321.                 }
  322.             }
  323.             else {
  324.                 system("cls");
  325.                 printf("Historia jest pusta !");
  326.                 Sleep(1000);
  327.                 system("cls");
  328.             }
  329.             break;
  330.         case 6:
  331.             // zapisanie listy do pliku
  332.             ZapiszDoPliku(glowa, "wynik.json");
  333.             //zwalnianie listy
  334.             wsk = glowa;
  335.             while (glowa != NULL) {
  336.                 wsk = glowa->nastepny;
  337.                 free(glowa);
  338.                 glowa = wsk;
  339.             }
  340.             exit(0);
  341.         default:
  342.             system("cls");
  343.             printf("Wybrano nieprawidlowa opcje");
  344.             Sleep(1000);
  345.             system("cls");
  346.             while (getchar() != '\n') {}
  347.             break;
  348.         }
  349.     }
  350.     //zwalnianie listy
  351.     wsk = glowa;
  352.     while (glowa != NULL) {
  353.         wsk = glowa->nastepny;
  354.         free(glowa);
  355.         glowa = wsk;
  356.     }
  357. }
  358. void zapisywanie(char* przed_konw, char* po_konw) {
  359.     wsk = glowa;
  360.     if (glowa == NULL) {
  361.         glowa = wsk = (struct historia*)malloc(sizeof(struct historia));
  362.         wsk->poprzedni = NULL;
  363.     }
  364.     else {
  365.         while (wsk->nastepny != NULL) {
  366.             wsk = wsk->nastepny;
  367.         }
  368.         wsk->nastepny = (struct historia*)malloc(sizeof(struct historia));
  369.         wsk->nastepny->poprzedni = wsk;
  370.         wsk = wsk->nastepny;
  371.     }
  372.     wsk->nastepny = NULL;
  373.     strcpy(wsk->przed_konwersja, przed_konw);
  374.     strcpy(wsk->po_konwersji, po_konw);
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement