Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int base = 16;
- void man(int);
- unsigned long long int power(int, int);
- unsigned long long int convert(int*, int);
- void char2int (char*, int*, int);
- void main (int argc, char * argv[]) {
- unsigned long long int answer = 0;
- int *decPointer, wasMinus = 0, length, i = 0, arrayLength[18] = {0, 0, 64, 41, 32 ,28, 25, 23, 22, 21, 20, 19, 18, 18, 17, 17, 16};
- char *hexPointer, c;
- if (argc > 2) man(2);
- if (argc == 2)
- {
- if (strcmp(argv[1], "-help") == 0) man(0);
- if (argv[1][0] == '-') man(3);
- base = atoi(argv[1]);
- }
- if (base == 0) man(3);
- if (base > 16) man(4);
- if (argc == 1) man(5);
- char hex[arrayLength[base]];
- int dec[arrayLength[base]];
- hexPointer = &hex[0];
- decPointer = &dec[0];
- printf("Перевод из системы с основанием %d в десятеричную. Максимум %d символов в каждом числе.\n", base, arrayLength[base]);
- while ((c = getchar()) != '\n')
- {
- if (c == '-') {putchar(c); c = getchar(); wasMinus = 1;}
- while ((c != ' ') && (c != '\n'))
- {
- *(hexPointer+i) = c;
- i++;
- c = getchar();
- wasMinus = 0;
- }
- length = i;
- if (length > arrayLength[base]) man(6);
- if ((length > 0) && (wasMinus == 0))
- {
- i = 0;
- char2int(&hex[0], &dec[0], length);
- answer = convert(&dec[0], length);
- printf("%llu ", answer);
- if (c == '\n') printf("\n");
- }
- }
- }
- unsigned long long int power (int base, int degree) {
- int i;
- unsigned long long int result = 1;
- for (i = 1; i <= degree-1; i++)
- {
- result = result * base;
- }
- return result;
- }
- unsigned long long int convert(int *decPointer, int len) {
- unsigned long long int result = 0;
- int i = 0;
- while (len > 0)
- {
- result = result + (*(decPointer+i) * power(base, len));
- len--;
- i++;
- }
- return result;
- }
- void char2int (char *hexPointer, int *decPointer, int hexLength) {
- int num, n = 0;
- while (n < hexLength)
- {
- num = *(hexPointer+n);
- if ((num >= '0') && (num <= '9')) {*(decPointer+n) = num-'0';}
- else if ((num >= 'A') && (num <= 'F')) {*(decPointer+n) = num-55;}
- else if ((num >= 'a') && (num <= 'f')) {*(decPointer+n) = num-87;}
- else man(1);
- if (*(decPointer+n) > base) man(1);
- n++;
- }
- }
- void man (int action)
- {
- switch (action) {
- case 0:
- printf("\n**********Руководство по использованию программы***********\n* Данная программа может осуществлять перевод чисел *\n* из любой системы с основанием от 2 до 16 в десятеричную.*\n* По умолчанию используется шестнадцатеричная система. *\n");
- printf("* Вы можете выбрать свою систему при помощи аргументов. *\n* Пример: ./a.out 12 *\n***********************************************************\n");
- exit(1);
- break;
- case 1:
- printf("Введённое число не соответствует выбранной системе счисления.\nДля подробной информации используйте аргумент -help.\n");
- exit(1);
- break;
- case 2:
- printf("Слишком много аргументов. -help для подробной информации.\n");
- exit(1);
- break;
- case 3:
- printf("Неверный аргумент. Используйте -help для справки.\n");
- exit(1);
- break;
- case 4:
- printf("Выбранное основание слишком велико. Используйте -help для справки.\n");
- exit(1);
- break;
- case 5:
- printf("Программа запущена без аргументов. Используйте -help для справки.\n");
- break;
- case 6:
- printf("Введённое число слишком большое.\n");
- exit(1);
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement