Перевод строки из цифр и знаков перед ней в целое число - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Составить программу, которая переводит строку, состоящую из цифр и возможно из знаков + или - (в начале строки) в целое число

Решение задачи: «Перевод строки из цифр и знаков перед ней в целое число»

textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define MAX_INPUT_LENGTH 100
 
#pragma pack(1, push)
 
inline char in_array(const char*, char);
ptrdiff_t toDec(char*, int&);
void controlInput(char*, int&);
int input(char*);
 
int main(){
    char str[MAX_INPUT_LENGTH]={'\0'};
    int start=input(str);
    controlInput(str, start);
    system("PAUSE");
}
 
int input(char* str)
{
    fgets(str, MAX_INPUT_LENGTH, stdin);
    str[strlen(str)-1]='\0';
    int start=0;
    if(str[0]=='-' || str[0]=='+')
        start=1;
    return start;
}
 
inline char in_array(const char* arr, char key){
    for(size_t i = 0; i < strlen(arr); ++i)
        if(arr[i]==key)
            return 1;
    return 0;
}
 
void controlInput(char* str, int &start){
    while(strlen(str)==1 && start==1)
    {
        printf("\nNekorrectno vvedeni dannie!\nVvedite ih echo raz: \n");
        start=input(str);
    }
    char nums[]="0123456789";
    for(size_t i = start; i < strlen(str); ++i){
        if(!in_array(nums, str[i])){
            printf("\nNekorrectno vvedeni dannie!\nVvedite ih echo raz: \n");
            start=input(str);
            i=start;
        }
    }
    #ifndef _WIN64
        printf("\n--------\n%I32d\n", toDec(str, start));
    #else
        printf("\n--------\n%I64d\n", toDec(str, start));
    #endif
 
}
 
ptrdiff_t toDec(char* str, int &start){
    size_t mnoj=1;
    ptrdiff_t out=0;
    for(ptrdiff_t i=strlen(str)-1; i>=start; --i)
    {
        out+=(str[i]-48)*mnoj;
        mnoj*=10;
    }
    if( str[0]=='-' )
        out*=-1;
    return out;
}
#pragma pack(pop)

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

  1. Включаются необходимые заголовочные файлы: stdlib.h, printf.h и string.h
  2. Определяются макросы: — MAX_INPUT_LENGTH — максимальная длина вводимой строки — #pragma pack(1, push) — инструкция компилятору о сохранении регистров при вызове функций — #pragma pack(pop) — восстановление предыдущего состояния упаковки регистров
  3. Определяются три функции: — input — считывает строку из стандартного ввода и возвращает индекс первого непустого символа — controlInput — обрабатывает введенную строку, проверяет корректность ввода и выводит десятичное представление числа — toDec — переводит строку в десятичное число, учитывая знак и масштабирование чисел с плавающей точкой
  4. Функция main начинается с инициализации строки для ввода и нулевого значения переменной start.
  5. Ввод строки осуществляется с помощью функции input, которая считывает строку и возвращает индекс первого непустого символа.
  6. Если первый символ строки — минус или плюс, то значение переменной start устанавливается равным 1.
  7. В цикле while выполняется проверка корректности введенной строки: если строка содержит только один символ и start равно 1, то выводится сообщение об ошибке и осуществляется повторный ввод строки.
  8. В цикле for проверяется каждый символ строки на принадлежность к допустимому набору чисел. Если символ не принадлежит к набору, то выводится сообщение об ошибке и осуществляется повторный ввод строки с обновленным значением start.
  9. Вызывается функция toDec для преобразования строки в десятичное число с учетом знака и масштабирования чисел с плавающей точкой.
  10. Выводится десятичное представление числа.

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


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

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

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