/* if (glowa == NULL) { glowa = wsk = (struct historia*)malloc(sizeof(struct historia)); wsk->poprzedni = NULL; } else { while (wsk->nastepny != NULL) { wsk = wsk->nastepny; } wsk->nastepny = (struct historia*)malloc(sizeof(struct historia)); wsk->nastepny->poprzedni = wsk; wsk = wsk->nastepny; } wsk->nastepny = NULL; wsk->przed_konwersja = cos_co_chcesz_zapisac typu int !; wsk->po_konwersji = cos_co_chcesz_zapisac typu int !; */ #include #include //funkcja strlen #include #include #pragma warning( disable : 4996 ) struct historia* glowa = NULL, * wsk = NULL; void zapisywanie(char* przed_konw, char* po_konw); int menu() { //A - HEX //B - BIN //C - OCT //D - DEC int choice; printf("1. Konwersja z A -> B (HEX -> BIN)"); printf("\n2. Konwersja z B -> A (BIN -> HEX)"); printf("\n3. Konwersja z C -> D (OCT -> DEC)"); printf("\n4. Konwersja z D -> C (DEC -> OCT)"); printf("\n5. Historia operacji "); printf("\n6. Zakoncz program \n"); printf("\nWybierz opcje: "); scanf_s("%d", &choice); return choice; } void decToSmth(int* n, char* h, int x) { int temp = 0; int i = 0; char tab_pom[50]; for (i; *n != 0; *n /= x) //dopoki nie skonczy { temp = *n % x; if (temp < 10) { tab_pom[i] = *(h + i) = temp + 48; i++; } else { tab_pom[i] = *(h + i) = temp + 55; i++; } } //zmienić kolejność char printf("Liczba w wybranym systemie to: "); for (int j = i - 1, k = 0; j >= 0, k <= i - 1; j--, k++) { *(h + k) = tab_pom[j]; //zmiana kolejnosci tablicy } for (int j = 0; j < i; j++) printf("%c", *(h + j)); } int numberToDec(char* n, int dl, int x, int l) { int base = 1; //tu będzie mnożnik (dla oct: 8*8... dla hex: 16*16...) int decimal = 0; for (int i = dl - 1; i >= 0; i--) { if (*(n + i) >= '0' && *(n + i) <= '9') { decimal += (*(n + i) - 48) * base; // kod ascii liczby 0 to 48, stąd odejmujemy 48 base *= x; } else if (*(n + i) >= 'A' && *(n + i) <= 'F') { decimal += (*(n + i) - 55) * base; // kod ascii litery A (10 w hex) to 65, stąd odejmujemy 55 base *= x; } else if (*(n + i) >= 'a' && *(n + i) <= 'f') // kod ascii litery a (10 w hex) to 97, stąd odejmujemy 87 { decimal += (*(n + i) - 87) * base; base *= x; } } return decimal; } struct historia { char przed_konwersja[50]; char po_konwersji[50]; historia* nastepny; historia* poprzedni; }; char hex[50], oct[50], bin[50], dec_tab[50]; int main() { int licznik = 0; int hex_dl, oct_dl, bin_dl, dec_dl; int dec; int* ptr_dec = &dec; int limit = 2147483647 - 75060; short int choice = 0; char* check; //zmienna potrzebna do sprawdzenia poprawności danych while (true) { for (int i = 0; i < 50; i++) { hex[i] = oct[i] = bin[i] = dec_tab[i] = NULL; } choice = menu(); //wyswietlanie menu if (licznik == 10 && choice != 5 && choice != 6) { system("cls"); printf("Nie mozna dodac wiecej elementow !\n"); Sleep(1000); system("cls"); continue; } switch (choice) //wybór opcji { case 1: printf("\nWpisz prosze liczbe w systemie szesnastkowym: "); scanf_s("%50s", hex, 50); *ptr_dec = strtol(hex, &check, 16); //funkcja sprawdzająca poprawnośc danych dla danego systemu if (*check) //jeśli zmienna check będzie miała wartość (jest niepusta), to znaczy że dane są nieprawidłowe { printf("\nPodano nieprawidlowa wartosc"); return 0; } if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci się w limicie i nie jest naturalna { printf("Liczba jest za duza, badz jest ujemna!"); return 0; } hex_dl = strlen(hex); //pobiera dlugosc ciągu znaków *ptr_dec = numberToDec(hex, hex_dl, 16, limit); //konwersja liczby na dziesiętną decToSmth(ptr_dec, bin, 2); zapisywanie(hex, bin); licznik++; printf("\n\n"); system("PAUSE"); system("cls"); break; case 2: printf("\nWpisz prosze liczbe w systemie binarnym: "); scanf_s("%50s", bin, 50); *ptr_dec = strtol(bin, &check, 2); //funkcja sprawdzająca poprawnośc danych dla danego systemu if (*check) //jeśli zmienna check będzie miała wartość (jest niepusta), to znaczy że dane są nieprawidłowe { printf("\nPodano nieprawidlowa wartosc"); return 0; } if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci się w limicie i nie jest naturalna { printf("Liczba jest za duza, badz jest ujemna!"); return 0; } bin_dl = strlen(bin); //pobiera dlugosc ciągu znaków *ptr_dec = numberToDec(bin, bin_dl, 2, limit); //konwersja liczby na dziesiętną decToSmth(ptr_dec, hex, 16); zapisywanie(bin, hex); licznik++; printf("\n\n"); system("PAUSE"); system("cls"); break; case 3: printf("\nWpisz prosze liczbe w systemie osemkowym: "); scanf_s("%50s", oct, 50); *ptr_dec = strtol(oct, &check, 8); //funkcja sprawdzająca poprawnośc danych dla danego systemu if (*check) //jeśli zmienna check będzie miała wartość (jest niepusta), to znaczy że dane są nieprawidłowe { printf("\nPodano nieprawidlowa wartosc"); return 0; } if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci się w limicie i nie jest naturalna { printf("Liczba jest za duza, badz jest ujemna!"); return 0; } oct_dl = strlen(oct); //pobiera dlugosc ciągu znaków *ptr_dec = numberToDec(oct, oct_dl, 8, limit); //konwersja liczby na dziesiętną decToSmth(ptr_dec, dec_tab, 10); zapisywanie(oct, dec_tab); licznik++; printf("\n\n"); system("PAUSE"); system("cls"); break; case 4: printf("\nWpisz prosze liczbe w systemie dziesietnym: "); scanf_s("%50s", dec_tab, 50); *ptr_dec = strtol(dec_tab, &check, 10); //funkcja sprawdzająca poprawnośc danych dla danego systemu if (*check) //jeśli zmienna check będzie miała wartość (jest niepusta), to znaczy że dane są nieprawidłowe { printf("\nPodano nieprawidlowa wartosc"); return 0; } if (!(*ptr_dec >= 0 && *ptr_dec <= limit)) //jesli nie miesci się w limicie i nie jest naturalna { printf("Liczba jest za duza, badz jest ujemna!"); return 0; } dec_dl = strlen(dec_tab); //pobiera dlugosc ciągu znaków *ptr_dec = numberToDec(dec_tab, dec_dl, 10, limit); //konwersja liczby na dziesiętną (forma int) decToSmth(ptr_dec, oct, 8); zapisywanie(dec_tab, oct); licznik++; printf("\n\n"); system("PAUSE"); system("cls"); break; case 5: int wybor; wsk = glowa; if (wsk != NULL) { while (wsk->nastepny != NULL) { wsk = wsk->nastepny; } system("cls"); printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji); while (1) { printf("Co chcesz zrobic ?\nPoprzednia konwersja (1)\tNastepna konwersja (2)\t\tUsun(3)\t\tWyjdz (4)\n\n"); printf("Twoj wybor:\t"); while (scanf_s("%d", &wybor) != 1 || wybor < 1 || wybor > 4 || getchar() != '\n') { system("cls"); printf("Nie ma takiej opcji. Sprobuj ponownie !\n"); while (getchar() != '\n') {} printf("Co chcesz zrobic ?\nPoprzednia konwersja (1)\tNastepna konwersja (2)\t\tUsun(3)\t\tWyjdz (4)\n\n"); printf("Twoj wybor:\t"); } if (wybor == 1) { if (wsk->poprzedni != NULL) { wsk = wsk->poprzedni; system("cls"); printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji); } else { system("cls"); printf("Nie ma poprzedniego elementu !\n\n"); Sleep(1000); system("cls"); printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji); } } else if (wybor == 2) { if (wsk->nastepny != NULL) { wsk = wsk->nastepny; system("cls"); printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji); } else { system("cls"); printf("Nie ma nastepnego elementu !"); Sleep(1000); system("cls"); printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk->przed_konwersja, wsk->po_konwersji); } } else if (wybor == 3) { if (wsk->poprzedni == NULL && wsk->nastepny == NULL) { free(wsk); glowa = NULL; } else if (wsk->poprzedni == NULL && wsk->nastepny != NULL) { glowa = glowa->nastepny; free(wsk); } else if (wsk->nastepny == NULL) { wsk->poprzedni->nastepny = NULL; free(wsk); } else { wsk->poprzedni->nastepny = wsk->nastepny; wsk->nastepny->poprzedni = wsk->poprzedni; free(wsk); } licznik--; system("cls"); break; } else { system("cls"); break; } } } else { system("cls"); printf("Historia jest pusta !"); Sleep(1000); system("cls"); } break; case 6: //zwalnianie listy wsk = glowa; while (glowa != NULL) { wsk = glowa->nastepny; free(glowa); glowa = wsk; } exit(0); default: system("cls"); printf("Wybrano nieprawidlowa opcje"); Sleep(1000); system("cls"); while (getchar() != '\n') {} break; } } //zwalnianie listy wsk = glowa; while (glowa != NULL) { wsk = glowa->nastepny; free(glowa); glowa = wsk; } } void zapisywanie(char* przed_konw, char* po_konw) { wsk = glowa; if (glowa == NULL) { glowa = wsk = (struct historia*)malloc(sizeof(struct historia)); wsk->poprzedni = NULL; } else { while (wsk->nastepny != NULL) { wsk = wsk->nastepny; } wsk->nastepny = (struct historia*)malloc(sizeof(struct historia)); wsk->nastepny->poprzedni = wsk; wsk = wsk->nastepny; } wsk->nastepny = NULL; strcpy(wsk->przed_konwersja, przed_konw); strcpy(wsk->po_konwersji, po_konw); }