Avatar
Tomulino
Neregistrovaný
Avatar
Tomulino:

Ludia potrebujem poradiť .... mám program ktorý mi má z poľa vypísať čísla pod eseba.... sú typu float a majú byť zarované pod seba podľa desatinnej bodky .... teda aj číslo 1.1 aj 111.111 majú mať pod sebou desatinnú bodku a pred číslo nemožem dať 0 ale ma tab byť normálna medzera .... hepl me pls :D

 
Odpovědět 25.11.2012 13:59
Avatar
matesax
Redaktor
Avatar
Odpovídá na Tomulino
matesax:

Regex, nebo odečti celočíselnou hodnotu - tak jako tak se dozvíš desetinnou část a tu pak použiješ v cyklu...

 
Nahoru Odpovědět 25.11.2012 14:53
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomulino
David Čápka:

Můžeš si nastudovat formátování floatu do stringu pomocí metody ToString() - http://msdn.microsoft.com/…gle.tostring(v=vs.80).aspx nebo s čísly jednoduše pracovat jako s řetězcem, když je vypisuješ. Stačí si zjistit délku celé části a potom před něj vložíš mezery, kolik jich tam chybí.

Editováno 26.11.2012 13:49
Nahoru Odpovědět 26.11.2012 13:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Pokud nedělá v .NETu tak mu funkce ToString() nebude moc platná :D

 
Nahoru Odpovědět 26.11.2012 15:19
Avatar
Odpovídá na Tomulino
Lukáš Hruda (Luckin):

Nenapsal si tu jestli to potřebuješ v C nebo v C++, tak sem si to vyzkoušel v C a de to snadno přes konverzi na int. Stačí to číslo převést na int a pořád dělit deseti dokud je větší než 0, tim zjistíš kolik cifer má celočíselná část. Největší hodnotu uložíš do nějaký proměnný (třeba max). Pak jenom před každý číslo vypíšeš max - cifry mezer (cifry je počet cifer celočíselný části danýho čísla). Samozřejmě pokud je číslo záporný tak musíš tu int hodnotu vynásobit -1 a počet cifer zvětšit o 1.

 
Nahoru Odpovědět 26.11.2012 16:12
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Jaj, přehlédl jsem jazyk, moje chyba :)

Nahoru Odpovědět 26.11.2012 16:39
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
matesax:

To je jednodušší:

"Regex, nebo odečti celočíselnou hodnotu - tak jako tak se dozvíš desetinnou část a tu pak použiješ v cyklu..."

Regex ti dá počet míst, a odečtení celočíselné části přesnou hodnotu desetinné části...

 
Nahoru Odpovědět 26.11.2012 17:08
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

Desetinnou část přece vůbec nepotřebuješ. Potřebuješ jenom celočíselnou část, abys věděl o kolik mezer to máš posunout od kraje. Když máš třeba 107.27, 20.5 a 20.0005 tak to bude vypadat:

107.27
_20.5
_20.0005

Z desetinnou částí vůbec nehejbáš. K 20.5 i 20.0005 přidáváš pokaždý jednu mezeru, aby tečky byly pod sebou. Tedy desetinnou část mají odlišnou, ale posouváš je stejně.

Editováno 26.11.2012 17:23
 
Nahoru Odpovědět 26.11.2012 17:22
Avatar
matesax
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
matesax:

To je snad jedno... Buď vezmu celočíselnou část - odečtu od délky celého čísla délku stringu z té celočíselné části, nebo Regex - délka stringu... A přesnou hodnotu budeš chtít v případě, že ti bude záležet na přechodu z 99_ ...

Editováno 26.11.2012 18:19
 
Nahoru Odpovědět 26.11.2012 18:18
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

To to ale nejdřív musíš převést na ten string. Tak jak sem to myslel já to můžeš dělat rovnou z těch čísel.

 
Nahoru Odpovědět 26.11.2012 18:22
Avatar
matesax
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
matesax:

Jak chceš jinak změřit délku čísla?

 
Nahoru Odpovědět 26.11.2012 18:28
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

Dělit deseti dokud je větší než 0 a při každym vydělení zvětšit délku o 1. Pro int to funguje a jelikož tady nepotřebuješ znát délku desetinný části tak to na int můžeš převést.

void print(float* arr, int n)
{
  int i,j;
  int max_count = 0;
  int* counts = malloc(sizeof(int) * n);
  for(i=0;i<n;i++)
  {
    int count = 0;
    int value = (int)arr[i];
    if(value <= 0)
    {
      value *= -1;
      count = 1;
    }
    while(value > 0)
    {
      count++;
      value /= 10;
    }
    counts[i] = count;
    if(count > max_count)
      max_count = count;
  }

  for(i=0;i<n;i++)
  {
    for(j=0;j < max_count - counts[i];j++)
      printf(" ");
    printf("%f\n",arr[i]);
  }

  free((void*)counts);
}
 
Nahoru Odpovědět 26.11.2012 18:32
Avatar
matesax
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
matesax:

Takže není jednodušší string.Length? (Nebo jak je to v C/C++)

 
Nahoru Odpovědět 26.11.2012 18:39
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

Je ale to nejdřív musíš na ten string převést. V C++ má třída string určitě nějakou členskou funkci která převádí float/double na řetězec. Já osobně ale třídu string nerad používam protože neni kompatibilní z Céčkovýma knihovnama, mam na práci s řetězcema svojí vlastní třídu. Navíc v C asi žádná standardní funkce pro převod float na char* neni a on tu nespecifikoval jestli to má bejt v C nebo C++. Než si psát vlastní funkci pro převod na řetězec to máš jednodušší udělat takhle. Navíc podle mě pokud je někdo začátečník, tak neni dobrý programovat stylem že si na všechno najdeš funkci/třídu v nějaký knihovně a tu jenom použiješ, tak se vůbec nenaučíš programátorsky myslet.

 
Nahoru Odpovědět 26.11.2012 18:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.