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