feat: implement numeral system converter with validation and error handling
Co-authored-by: aider (openrouter/qwen/qwen3-coder) <aider@aider.chat>
This commit is contained in:
parent
14373b1ad4
commit
fbc5308a31
128
src/main.c
128
src/main.c
@ -0,0 +1,128 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// Function to convert a character to a digit
|
||||
int char_to_digit(char c) {
|
||||
if (c >= '0' && c <= '9') {
|
||||
return c - '0';
|
||||
} else if (c >= 'A' && c <= 'F') {
|
||||
return c - 'A' + 10;
|
||||
} else if (c >= 'a' && c <= 'f') {
|
||||
return c - 'a' + 10;
|
||||
}
|
||||
return -1; // Invalid character
|
||||
}
|
||||
|
||||
// Function to convert a digit to a character
|
||||
char digit_to_char(int d) {
|
||||
if (d >= 0 && d <= 9) {
|
||||
return '0' + d;
|
||||
} else if (d >= 10 && d <= 15) {
|
||||
return 'A' + (d - 10);
|
||||
}
|
||||
return '\0'; // Invalid digit
|
||||
}
|
||||
|
||||
// Function to convert a number from given base to decimal
|
||||
long long to_decimal(const char *num, int base) {
|
||||
long long result = 0;
|
||||
int len = strlen(num);
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
int digit = char_to_digit(num[i]);
|
||||
if (digit == -1 || digit >= base) {
|
||||
return -1; // Invalid digit for the given base
|
||||
}
|
||||
result = result * base + digit;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Function to convert a decimal number to given base
|
||||
void from_decimal(long long num, int base, char *result) {
|
||||
if (num == 0) {
|
||||
result[0] = '0';
|
||||
result[1] = '\0';
|
||||
return;
|
||||
}
|
||||
|
||||
char temp[65]; // Enough to hold a 64-bit number in binary
|
||||
int index = 0;
|
||||
|
||||
while (num > 0) {
|
||||
temp[index++] = digit_to_char(num % base);
|
||||
num /= base;
|
||||
}
|
||||
|
||||
// Reverse the string
|
||||
for (int i = 0; i < index; i++) {
|
||||
result[i] = temp[index - 1 - i];
|
||||
}
|
||||
result[index] = '\0';
|
||||
}
|
||||
|
||||
// Function to validate if a number is valid in the given base
|
||||
int is_valid_number(const char *num, int base) {
|
||||
int len = strlen(num);
|
||||
if (len == 0) return 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
int digit = char_to_digit(num[i]);
|
||||
if (digit == -1 || digit >= base) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
// Check the number of arguments
|
||||
if (argc != 4) {
|
||||
fprintf(stderr, "Błąd: Nieprawidłowa liczba argumentów.\n");
|
||||
fprintf(stderr, "Użycie: %s <liczba> <system_z> <system_na>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Parse the bases
|
||||
int base_from, base_to;
|
||||
if (sscanf(argv[2], "%d", &base_from) != 1 ||
|
||||
sscanf(argv[3], "%d", &base_to) != 1) {
|
||||
fprintf(stderr, "Błąd: Podstawy systemów muszą być liczbami całkowitymi.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Check if bases are in valid range
|
||||
if (base_from < 2 || base_from > 16) {
|
||||
fprintf(stderr, "Błąd: System źródłowy musi być w zakresie 2-16.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (base_to < 2 || base_to > 16) {
|
||||
fprintf(stderr, "Błąd: System docelowy musi być w zakresie 2-16.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Check if the input number is valid in the source base
|
||||
if (!is_valid_number(argv[1], base_from)) {
|
||||
fprintf(stderr, "Błąd: Liczba '%s' jest nieprawidłowa w systemie o podstawie %d.\n", argv[1], base_from);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Convert to decimal
|
||||
long long decimal = to_decimal(argv[1], base_from);
|
||||
if (decimal == -1) {
|
||||
fprintf(stderr, "Błąd: Nie udało się przekonwertować liczby do systemu dziesiętnego.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Convert from decimal to target base
|
||||
char result[65]; // Enough to hold a 64-bit number in binary
|
||||
from_decimal(decimal, base_to, result);
|
||||
|
||||
// Print the result
|
||||
printf("%s\n", result);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user