2017-02-12 4 views
0

извините, если заголовок в замешательстве, мне просто нужны некоторые опытные программисты, чтобы попытаться прояснить что-то для меня. Поэтому один из вопросов моей домашней работы задает мне вопрос (язык c):Как преобразовать строку в двойное значение с плавающей запятой?

Напишите функцию, которая получает строку и возвращает двойное значение с плавающей запятой. Декларация fucntion будет выглядеть следующим образом

double convertFloat(char s[]); 

Не используйте функцию strtol() или любую другую функцию стандартной библиотеки C. Напишите свой собственный! ... Обратите внимание, что входная строка может иметь любой из следующих форматов: «1.34», «-1.4554», «6».

Я просто не уверен, как подойти к этому, потому что я не уверен, что здесь задают. Если бы мне пришлось написать функцию, чтобы найти квадратный корень или что-то в этом роде, я мог бы сделать это без проблем, но кажется, что мне нужно взять строки, которые являются всеми числами, и преобразовать их в плавающие ... просто не уверен, с чего начать и Подобные вещи в googling не дали никаких результатов.
Спасибо вам все заблаговременно.
- Davey

+0

Сначала запишите точное описание строки с плавающей запятой. Знак, цифры, десятичная точка, больше цифр. Затем перейдите слева направо, превращая символы в числа. – stark

+0

Вам нужно разобрать строку, проверить 1-й символ, если '-' или нет, а затем преобразовать все числа символов в число (вычесть из ASCII '0') умножить на 10 в зависимости от позиции. Сделайте то же самое для цифр после '.' но мощность от 10 до отрицательного показателя. – OldProgrammer

+0

Вы должны проанализировать строку один символ (цифру) за раз. Например, первый символ равен «1»: так что результат теперь равен 1. Затем появляется символ «2». Ах! Старый результат должен быть умножен на 10, затем добавляется 2. Итак, теперь результат равен 12. И так далее. Необязательный знак и точка должны управляться также, но это первый скелет. – linuxfan

ответ

-1

Here - пример реализации strtof. Это должно помочь вам начать работу и ответить на ваш вопрос. Код предполагает, что вы знаете о template. Итак, если вы хотите что-то такое общее, вам нужно научиться templates.

Кроме того, код может быть изменен, чтобы работать только для поплавка (путем замены type с float и удалением template <typename type> линии. Но я разделял общий подход.

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

+0

Почему downvote? : | – Abhishek

+0

Довольно уверен, что это было из-за строки в вопросе: «** Не используйте ** функцию strtol() или ** любую другую стандартную библиотечную функцию c **. Напишите свою собственную! ...« Но это было не так », я проголосовал за это, поэтому я не могу быть уверен. – Sienile

+1

Не используется встроенная функция. Это фактическая реализация с несколькими пропущенными краевыми случаями. :) – Abhishek

-1

Вот полный код вашей проблемы. Этот код понятен. Спросите, если у вас есть какие-либо сомнения в отношении его.

#include <stdio.h> 

int power(int n, int m) 
{ 
    if (m == 1) 
     return n; 
    else 
     return n * (power(n, m - 1)); 
} 

int getLength(char s[]) 
{ 
    int i = 0; 
    for(i = 0; s[i] != '\0'; i++); 
    return i; 
} 

double convertFloat(char s[]) 
{ 
    int len = getLength(s); 
    int dotpos = 0; 
    double result = 0.0f; 
    int n = 0, flag = 0; 
    if(s[0] == '-') 
    { 
     n = 1; 
     flag = 1; 
    } 
    for (; n < len; n++) 
    { 
     if (s[n] == '.') 
     { 
      dotpos = len - n - 1; 
     } 
     else 
     { 
      result = result * 10 + (s[n] - '0'); 
     } 
    } 
    result /= power(10, dotpos); 
    if(flag) 
     return result*-1; 
    return result; 
} 

int main() 
{ 
    char str[] = "126433.47"; 
    printf("%f", convertFloat(str)); 
} 
0

Начните писать

unsigned int convertUnsignedInt(const char *s); 
// e.g. convertUnsignedInt("42") == 42 

Это немного проще, потому что вы не должны обрабатывать отрицательные числа или фракции, но это показывает общий принцип.

Смежные вопросы