Ограничить используемые символы в представлении чисел - C (СИ)
Формулировка задачи:
Все правильно считает но не могу ограничить символы. Короче на 11-16 системе любую букву считает правильно но нужно только до A-F. как ограничить кто нибудь знает **???
#include<stdio.h>
#include<ctype.h>
#include<math.h>
#include<stdlib.h>
void IsErrorNotation(int i){ /*ïðîâåðêГ* îøèáîê ââîäГ**/
if(i<2||i>16){
puts("Error: numeric system must be between [2...16]");
exit(1);
}
}
void IsErrorNumber(char* a, int basefrom){ /*ïðîâåðêГ* îøèáîê ââîäГ**/
if(basefrom<=10){
for(; *a; ++a){
if(*a<48||*a>=48+basefrom){
printf("Error: all inputted number symbols must be between [0...%d]", basefrom-1);
printf("\n");
system("pause");
exit(1);
}
}
}
}
int main(){
int i=0, x=0, basefrom, baseto;
char a[20]={'\0'}, b[20], *p=a;
puts("Input initial numeric system [2...16]"); /*èñõîäГ*Г*Гї Г±ГЁГ±ГІГҐГ¬Г* ñ÷èñëåГ*ГЁГї*/
scanf("%d", &basefrom);
IsErrorNotation(basefrom);
puts("Input final numeric system [2...16]"); /*ðåçóëüòèðóþùГ*Гї Г±ГЁГ±ГІГҐГ¬Г* ñ÷èñëåГ*ГЁГї*/
scanf("%d", &baseto);
IsErrorNotation(baseto);
getchar();
printf("Input number in %d notation:\n", basefrom); /*Г±Г*ìî ÷èñëî*/
gets(a);
IsErrorNumber(a, basefrom);
while(*(p+1)) ++p;
for(; p>=a; --p, ++i){
if(*p>'9'){
*p=toupper(*p);
*p-=7;
}
x+=(*p-48)*pow(basefrom, i);
}
printf("number in 10 notation:\n%d\n", x);
i=0;
while (x){
b[i]=x%baseto;
x/=baseto;
++i;
}
printf("number in %d notation:\n", baseto);
while(--i>=0){
b[i]>=9? printf("%c", b[i]+55): printf("%d", b[i]);
};printf("\n");
system ("pause");
}Решение задачи: «Ограничить используемые символы в представлении чисел»
textual
Листинг программы
void IsErrorNumber(char* a, int basefrom)
{
for(int i=0;i<strlen(a);i++)
if(basefrom<=10)
{
if( a[i]>='0' && a[i]<='0'+basefrom-1 )
continue;
printf("Error: all inputted digits symbols must be between [0...%d]\n", basefrom-1);
system("pause");
exit(1);
}else
{
if( a[i]>='0' && [i]<='9'
|| a[i]>='a' && a[i]<='a'+baseform-10
|| a[i]>='A' && a[i]<='A'+baseform-10)
continue;
printf("Error: all inputted symbols must be between [a...%c]\n",'a'+baseform-10);
system("pause");
exit(1);
}
}
Объяснение кода листинга программы
- Входные данные:
- a - указатель на строку, в которой нужно проверить число
- basefrom - основание системы счисления числа (от 2 до 16), вводимая в шестнадцатеричной системе счисления
- Выходные данные:
- В случае ошибки выводится сообщение об ошибке, после чего программа ожидает нажатия любой клавиши, а затем завершается с кодом ошибки 1.
- Алгоритм:
- Проходим по всем символам входной строки
- Если основание системы счисления меньше или равно 10, то проверяем, является ли текущий символ цифрой от 0 до basefrom-1
- Если основание системы счисления больше 10, то проверяем, является ли текущий символ цифрой от 0 до 9, буквой от a до a+basefrom-10 или буквой от A до A+basefrom-10
- Если текущий символ не является допустимым символом, то выводим сообщение об ошибке и завершаем программу с кодом ошибки 1.