Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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");
- 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];
- struct historia* nastepny;
- struct historia* poprzedni;
- };
- char hex[50], oct[50], bin[50], dec_tab[50];
- void ZapiszDoPliku(struct historia* glowa, const char* nazwaPliku) {
- FILE* out;
- // jezeli udalo sie poprawnie otworzyc/utworzyc plik o podanej nazwie
- if (fopen_s(&out, nazwaPliku, "w+") == 0 && out != NULL) {
- fprintf(out, "{\n");
- fprintf(out, "\t\"historia_zapisow\" : {\n");
- int numer = 1;
- while (glowa) {
- fprintf(out, "\t\t\"zapis%d\" : {\n", numer);
- fprintf(out, "\t\t\t\"konwertowana\" : \"%s\",\n", glowa->przed_konwersja);
- fprintf(out, "\t\t\t\"wartosc\" : \"%s\"\n", glowa->po_konwersji);
- fprintf(out, "\t\t}");
- if (glowa->nastepny != NULL) fprintf(out, ",\n");
- else fprintf(out, "\n");
- glowa = glowa->nastepny;
- numer++;
- }
- fprintf(out, "\t}\n");
- fprintf(out, "}\n");
- }
- // w przeciwnym razie powiadom o bledzie
- else printf("blad podczas otwierania pliku do zapisu. zapisanie historii sie nie powiodlo.\n");
- }
- 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) {
- system("cls");
- 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");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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!");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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!");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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!");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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!");
- while (getchar() != '\n') {} //"czyszczenie" bufora
- Sleep(1000);
- continue;
- }
- 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;
- glowa->poprzedni = NULL;
- 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:
- // zapisanie listy do pliku
- ZapiszDoPliku(glowa, "wynik.json");
- //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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement