niedziela, 3 stycznia 2016

C - Zmiana wartości float na znakową

W tym poście chciałbym opisać w jaki sposób dokonać konwersji liczby zmiennoprzecinkowej na wartość znakową.

Istnieją dwa proste sposoby na dokonanie takiej zamiany.

Sposób pierwszy polega na wykorzystaniu funkcji sprintf.

//Dolaczenie bibliotek
#include<stdio.h>
 
//Glowna petla programu
int main()
{
    //Deklaracja zmiennych
    char res[20];
    float n = 34545.984;
 
    //Wywolanie funkcji konwersji
    sprintf(res,"%f\n", n);
    //Wyswietlenie zmiennej
    printf("%s\n", res);
    //Zwrocenie wartosci
    return 0;
}

Drugi sposób działa poprzez wykorzystanie przygotowanej do tego celu funkcji. Całość programu wraz z komentarzem do każdej linijki przedstawiłem poniżej.

//Dolaczenie bibliotek
#include<stdio.h>
#include<math.h>
 
//Odwrócenie wartości o podanej dlugosc
void reverse(char *str, int len)
{
    //Deklaracja zmiennych
    int i=0, j=len-1, temp;
    while (i<j)
    {
        //Przypisanie wartosci do zmiennej
        temp = str[i];
        //Przepisanie wartosci
        str[i] = str[j];
        //Wpisanie przechowywanej wartosci do drugiej tablicy
        str[j] = temp;
        i++; j--;
    }
}
 
/*
    * konwertsja x na wartosc string.
    * zmienna d okresla ilosc cyfr jakie beda na wyjsciu.
*/
int intToStr(int x, char str[], int d)
{
    //Deklaracja zmiennej i
    int i = 0;
    //Petla dzia³a dopóki x jest mniejsze od 1
    while (x)
    {
        //Przypisanie do tablicy z kolejnym numerem wartoœci
        //x podzielonej bez reszty przez 10 oraz cyfry 0
        str[i++] = (x%10) + '0';
        //Podzielenie wartoœci x normalnie przez 10
        x = x/10;
    }
 
    // Jesli jest wymagana wieksza ilosc cyfr
    // zostana dodane zera
    while (i < d)
        str[i++] = '0';
 
    //Odwrocenie wartosci w funkcji reverse
    reverse(str, i);
    //Dopisanie znaku na koncu tablicy
    str[i] = '\0';
    return i;
}
 
/*
    * Konwersja formatu zmiennoprzecinkowego na znakowy
    * Jako argumenty nalezy podac odpowiednio
    * liczby w formacie float,
    * nazwe zdefiniowanej tablicy w formacie char,
    * ilosc miejsc po przecinku (format int)
*/
void ftoa(float n, char *res, int afterpoint)
{
    //Wyciagniecie calkowitej czesci liczby
    int ipart = (int)n;
 
    //wyciagniêcie czesci ulamkowej
    float fpart = n - (float)ipart;
 
    //konwerska liczby int na string
    int i = intToStr(ipart, res, 0);
 
    //Sprawdzenie czy ilosc wyswietlanych liczb po przecinku
    //jest wieksza od 0
    if (afterpoint != 0)
    {
        //Dodadanie kropki po liczbie calkowitej
        res[i] = '.';
 
        /*
            * Wartosc liczb po przecinku zostaje pomnozone
            * przez funkcję pow
            * Funkcja pow podnosi wartość do potegi,
            * Jako argumenty podstawa, oraz wartość potegi
        */
        fpart = fpart * pow(10, afterpoint);
 
        //Zamiana wartości znajdującej się po przecinku na wartosc
        //znakowa z wartosci int
        intToStr((int)fpart, res + i + 1, afterpoint);
    }
}
 
//Glowna petla programu
int main()
{
    //Deklaracja zmiennych
    char res[10];
    float n = 34545.984563;
 
    //Wywolanie funkcji konwersji
    ftoa(n, res, 6);
    //Wyswietlenie zmiennej
    printf("%s\n", res);
    //Zwrocenie wartosci
    return 0;
}