Diskuze: Zarovnanie
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Neregistrovaný
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Regex, nebo odečti celočíselnou hodnotu - tak jako tak se dozvíš desetinnou část a tu pak použiješ v cyklu...
Můžeš si nastudovat formátování floatu do stringu pomocí metody ToString() - http://msdn.microsoft.com/…=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í.
Pokud nedělá v .NETu tak mu funkce ToString() nebude moc platná
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.
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...
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ě.
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_ ...
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.
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);
}
Takže není jednodušší string.Length? (Nebo jak je to v C/C++)
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.
Zobrazeno 15 zpráv z 15.