/*
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 <stdio.h>
#include <string.h> //funkcja strlen
#include <stdlib.h>
#include <Windows.h>
#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");
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++)
}
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)
{
printf("Nie mozna dodac wiecej elementow !\n");
Sleep(1000);
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++;
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++;
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++;
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++;
break;
case 5:
int wybor;
wsk = glowa;
if (wsk != NULL)
{
while (wsk->nastepny != NULL)
{
wsk = wsk->nastepny;
}
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");
while (scanf_s
("%d", &wybor
) != 1 || wybor
< 1 || wybor
> 4 || getchar() != '\n')
{
printf("Nie ma takiej opcji. Sprobuj ponownie !\n");
printf("Co chcesz zrobic ?\nPoprzednia konwersja (1)\tNastepna konwersja (2)\t\tUsun(3)\t\tWyjdz (4)\n\n");
}
if (wybor == 1)
{
if (wsk->poprzedni != NULL)
{
wsk = wsk->poprzedni;
printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk
->przed_konwersja
, wsk
->po_konwersji
);
}
else
{
printf("Nie ma poprzedniego elementu !\n\n");
Sleep(1000);
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;
printf("Liczba przed konwersja: %s\nLiczba po konwersji: %s\n\n", wsk
->przed_konwersja
, wsk
->po_konwersji
);
}
else
{
printf("Nie ma nastepnego elementu !");
Sleep(1000);
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)
{
glowa = NULL;
}
else if (wsk->poprzedni == NULL && wsk->nastepny != NULL)
{
glowa = glowa->nastepny;
}
else if (wsk->nastepny == NULL)
{
wsk->poprzedni->nastepny = NULL;
}
else
{
wsk->poprzedni->nastepny = wsk->nastepny;
wsk->nastepny->poprzedni = wsk->poprzedni;
}
licznik--;
break;
}
else
{
break;
}
}
}
else
{
printf("Historia jest pusta !");
Sleep(1000);
}
break;
case 6:
//zwalnianie listy
wsk = glowa;
while (glowa != NULL)
{
wsk = glowa->nastepny;
glowa = wsk;
}
default:
printf("Wybrano nieprawidlowa opcje");
Sleep(1000);
break;
}
}
//zwalnianie listy
wsk = glowa;
while (glowa != NULL)
{
wsk = glowa->nastepny;
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
);
}