Ограничить используемые символы в представлении чисел - 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);
    }
}

Объяснение кода листинга программы

  1. Входные данные:
    • a - указатель на строку, в которой нужно проверить число
    • basefrom - основание системы счисления числа (от 2 до 16), вводимая в шестнадцатеричной системе счисления
  2. Выходные данные:
    • В случае ошибки выводится сообщение об ошибке, после чего программа ожидает нажатия любой клавиши, а затем завершается с кодом ошибки 1.
  3. Алгоритм:
    • Проходим по всем символам входной строки
    • Если основание системы счисления меньше или равно 10, то проверяем, является ли текущий символ цифрой от 0 до basefrom-1
    • Если основание системы счисления больше 10, то проверяем, является ли текущий символ цифрой от 0 до 9, буквой от a до a+basefrom-10 или буквой от A до A+basefrom-10
    • Если текущий символ не является допустимым символом, то выводим сообщение об ошибке и завершаем программу с кодом ошибки 1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы