Загрузка данных


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Функция проверки корректности двоичного числа
int isValidBinary(const char* str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] != '0' && str[i] != '1') {
            return 0; // Неверный символ
        }
    }
    return 1; // Корректное двоичное число
}

// Функция проверки корректности восьмеричного числа
int isValidOctal(const char* str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] < '0' || str[i] > '7') {
            return 0; // Неверный символ
        }
    }
    return 1; // Корректное восьмеричное число
}

// Функция проверки корректности шестнадцатеричного числа
int isValidHex(const char* str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (!((str[i] >= '0' && str[i] <= '9') ||
              (str[i] >= 'A' && str[i] <= 'F') ||
              (str[i] >= 'a' && str[i] <= 'f'))) {
            return 0; // Неверный символ
        }
    }
    return 1; // Корректное шестнадцатеричное число
}

// Функция преобразования двоичного в восьмиричный
void binaryToOctal(const char* binary) {
    int len = strlen(binary);
    int decimal = 0;
    
    // Переводим двоичное в десятичное
    for (int i = 0; i < len; i++) {
        decimal = decimal * 2 + (binary[i] - '0');
    }
    
    printf("Восьмеричное представление: ");
    if (decimal == 0) {
        printf("0\n");
    } else {
        char octal[100];
        int index = 0;
        while (decimal > 0) {
            octal[index++] = (decimal % 8) + '0';
            decimal /= 8;
        }
        for (int i = index - 1; i >= 0; i--) {
            printf("%c", octal[i]);
        }
        printf("\n");
    }
}

// Функция преобразования восьмеричного в двоичный
void octalToBinary(const char* octal) {
    int len = strlen(octal);
    int decimal = 0;
    
    // Переводим восьмеричное в десятичное
    for (int i = 0; i < len; i++) {
        decimal = decimal * 8 + (octal[i] - '0');
    }
    
    printf("Двоичное представление: ");
    if (decimal == 0) {
        printf("0\n");
    } else {
        char binary[1000];
        int index = 0;
        while (decimal > 0) {
            binary[index++] = (decimal % 2) + '0';
            decimal /= 2;
        }
        for (int i = index - 1; i >= 0; i--) {
            printf("%c", binary[i]);
        }
        printf("\n");
    }
}

// Функция преобразования двоичного в шестнадцатеричный
void binaryToHex(const char* binary) {
    int len = strlen(binary);
    int decimal = 0;
    
    // Переводим двоичное в десятичное
    for (int i = 0; i < len; i++) {
        decimal = decimal * 2 + (binary[i] - '0');
    }
    
    printf("Шестнадцатеричное представление: ");
    if (decimal == 0) {
        printf("0\n");
    } else {
        char hex[100];
        int index = 0;
        while (decimal > 0) {
            int remainder = decimal % 16;
            if (remainder < 10) {
                hex[index++] = remainder + '0';
            } else {
                hex[index++] = (remainder - 10) + 'A';
            }
            decimal /= 16;
        }
        for (int i = index - 1; i >= 0; i--) {
            printf("%c", hex[i]);
        }
        printf("\n");
    }
}

// Функция преобразования шестнадцатеричного в двоичный
void hexToBinary(const char* hex) {
    int len = strlen(hex);
    int decimal = 0;
    
    // Переводим шестнадцатеричное в десятичное
    for (int i = 0; i < len; i++) {
        int digit;
        if (hex[i] >= '0' && hex[i] <= '9') {
            digit = hex[i] - '0';
        } else if (hex[i] >= 'A' && hex[i] <= 'F') {
            digit = hex[i] - 'A' + 10;
        } else { // 'a'-'f'
            digit = hex[i] - 'a' + 10;
        }
        decimal = decimal * 16 + digit;
    }
    
    printf("Двоичное представление: ");
    if (decimal == 0) {
        printf("0\n");
    } else {
        char binary[1000];
        int index = 0;
        while (decimal > 0) {
            binary[index++] = (decimal % 2) + '0';
            decimal /= 2;
        }
        for (int i = index - 1; i >= 0; i--) {
            printf("%c", binary[i]);
        }
        printf("\n");
    }
}

int main() {
    int choice;
    char number[1000];
    
    printf("=== ПРЕОБРАЗОВАТЕЛЬ СИСТЕМ СЧИСЛЕНИЯ ===\n");
    printf("Выберите режим преобразования:\n");
    printf("1. Двоичный -> Восьмеричный\n");
    printf("2. Восьмеричный -> Двоичный\n");
    printf("3. Двоичный -> Шестнадцатеричный\n");
    printf("4. Шестнадцатеричный -> Двоичный\n");
    printf("Ваш выбор (1-4): ");
    
    scanf("%d", &choice);
    getchar(); // Очищаем буфер
    
    switch (choice) {
        case 1:
            printf("Введите двоичное число: ");
            fgets(number, sizeof(number), stdin);
            number[strcspn(number, "\n")] = 0; // Удаляем символ новой строки
            
            if (isValidBinary(number)) {
                printf("Входное двоичное число: %s\n", number);
                binaryToOctal(number);
            } else {
                printf("ОШИБКА: Неверный формат двоичного числа!\n");
            }
            break;
            
        case 2:
            printf("Введите восьмеричное число: ");
            fgets(number, sizeof(number), stdin);
            number[strcspn(number, "\n")] = 0;
            
            if (isValidOctal(number)) {
                printf("Входное восьмеричное число: %s\n", number);
                octalToBinary(number);
            } else {
                printf("ОШИБКА: Неверный формат восьмеричного числа!\n");
            }
            break;
            
        case 3:
            printf("Введите двоичное число: ");
            fgets(number, sizeof(number), stdin);
            number[strcspn(number, "\n")] = 0;
            
            if (isValidBinary(number)) {
                printf("Входное двоичное число: %s\n", number);
                binaryToHex(number);
            } else {
                printf("ОШИБКА: Неверный формат двоичного числа!\n");
            }
            break;
            
        case 4:
            printf("Введите шестнадцатеричное число: ");
            fgets(number, sizeof(number), stdin);
            number[strcspn(number, "\n")] = 0;
            
            if (isValidHex(number)) {
                printf("Входное шестнадцатеричное число: %s\n", number);
                hexToBinary(number);
            } else {
                printf("ОШИБКА: Неверный формат шестнадцатеричного числа!\n");
            }
            break;
            
        default:
            printf("ОШИБКА: Неверный выбор режима!\n");
            break;
    }
    
    printf("\nНажмите Enter для выхода...");
    getchar();
    return 0;
}