Перевод double в строку символов - C (СИ)
Формулировка задачи:
Написать функцию для преобразования переменной типа double
в строку символов с заданной точностью представления
( dtoa( double num, int npos, int nfr ) )
Попытался сохранить запятую привести к int и дальше через itoa, ничего не получается. помогите пожалуйста.
/* Написать функцию для преобразования переменной типа double в строку символов с заданной точностью представления ( dtoa( double num, int npos, int nfr ) ) */ #include "stdafx.h" #include <stdio.h> #include <string.h> #define MASS = 20; void dtoa(double num, char s[]); void reverse(char s[]); void main() { int i; double num; char s[MASS]; printf("Vvedite chislo tippa double: \n "); scanf("%f", &num); dtoa(num, s); printf("chislo: "); for(i = 0; i < MASS; i++){ printf("\t", s[i]); } } void dtoa(double num, char s[]) { int i, sign, zap; if ((sign = num) < 0) num = -num; while( (num % 10)==0){ // запоминаем запятую, и приводим к фун-ии itoa num*=10; zap++; } i = 0; do{ s[i++] = num % 10 + '0'; }while((num /= 10) > 0); if( sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); for(i = MASS; i > 0; i--){ while(s[zap] != ','){ s[i] = s [i-1]; s[i-1] = ','; } } } void reverse(char s[]) { int i,c,j; for (i=0, j=strlen(s)-1; i<j; i++, j--){ c = s[i]; s[i] = s[j]; s[j] = c; } }
видимо никто не может понять, как это делать...
Решение задачи: «Перевод double в строку символов»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <math.h> //----------------------------------------------------------------------------- void Swap(char* a, char* b) { char tmp = *a; *a = *b; *b = tmp; } //----------------------------------------------------------------------------- char* reverse(char* str) { char* begin = str; char* end = str; for (; *end; ++end) { ; } for (--end; begin < end; ++begin, --end) { Swap(begin, end); } return str; } //----------------------------------------------------------------------------- char* IntToAnsi(int dig, char str[], size_t len) { int i = 0; while (dig && (i < len - 1)) { str[i++] = (dig % 10) + '0'; dig /= 10; } if ((i == 0) && (i < len)) { str[i++] = '0'; } str[i] = '\0'; reverse(str); return str; } //----------------------------------------------------------------------------- char* DoubleToAnsi(double dig, size_t acc, char str[], size_t len) { int hi = (int) dig; int lo = (dig - hi) * pow(10, acc); char* pstr = str; IntToAnsi(hi, pstr, len); if (lo) { for (; *pstr; ++pstr) { ; } *pstr++ = ','; IntToAnsi(lo, pstr, len - (pstr - str)); } return str; } //----------------------------------------------------------------------------- int main() { char str[20]; printf("%s\n", DoubleToAnsi(12345.12345, 10, str, sizeof(str))); printf("%s\n", DoubleToAnsi(0, 6, str, sizeof(str))); printf("%s\n", DoubleToAnsi(123, 6, str, sizeof(str))); printf("%s\n", DoubleToAnsi(0.1, 6, str, sizeof(str))); return 0; }
Объяснение кода листинга программы
- В функции reverse() происходит перестановка символов в строке, начиная с первого и последнего символа, чтобы получить строку в обратном порядке.
- Функция IntToAnsi() преобразует целое число в строку, используя символы от '0' до '9'. Если число больше 9, то оно разбивается на части и преобразуется в строку с использованием функции reverse().
- Функция DoubleToAnsi() преобразует дробное число в строку, разбивая его на целую и дробную части. Сначала преобразуется целая часть числа, затем, если дробная часть не равна нулю, добавляется запятая и преобразуется дробная часть числа.
- В функции main() создается массив символов str, который используется для хранения преобразованных чисел.
- Затем вызывается функция DoubleToAnsi() для преобразования чисел 12345.12345, 0, 123, 0.1 и сохранения результата в массиве str.
- Результат выводится на экран с помощью функции printf().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д