Перевод 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().