Posledních 14 dní jsem byl poněkud zaměstnán školou a nebyl vůbec čas vyplodit sem nějakou tu myšlenku. Rád bych to nyní alespoň nepatrno napravil řešením relativně jednoduché, leč zajímavé úlohy rozkladu čísla na jednotlivé číslice s jejich následným součtem, určením počtu cifer a zobrazením.
Všechny zmíněné operace lze provést například pomocí těchto statických metod:
- int pocetCiferCisla(int cislo) - vrací počet cifer čísla
- int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer) - vrací pole číslic z rozloženého čísla
- int soucetCislic(int[] poleCislic) - vrací součet číslic pole
- string zobrazCislice(int[] poleCislic) - vrací řetězec vypsaných číslic z pole
Zdrojové kódy jednotlivých metod hned následují:
int pocetCiferCisla(int cislo)
//Metoda pocetCiferCisla vraci počet cifer čísla uvedeného v parametru
public static int pocetCiferCisla(int cislo)
{
int cifry = 0;
//Dělí číslo 10 dokud není 0 a přičítá počet cifer za každé dělení
while (cislo > 0)
{
cislo /= 10;
cifry++;
}
return cifry;
}
int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer)
//Metoda rozkladCislaNaCislice vrací pole jednotlivých číslic po rozkladu čísla v parametru
//int rozkladoveCislo je číslo k rozkladu a pocetCifer se udává z důvodu velikosti pole
public static int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer)
{
int cislice = 0;
int[] poleCislic = new int[pocetCifer];
//Dokud není rozkladové číslo 0 je jeho zbytek po dělení 10 (%) ukládán jako cislice do poleCislic
for (int i = 0; rozkladoveCislo != 0; i++)
{
cislice = rozkladoveCislo % 10;
rozkladoveCislo /= 10;
poleCislic[i] = cislice;
}
//Číslice se do pole vkládají od konce je tedy dobré jej nakonci otočit metodou Array.Reverse()
Array.Reverse(poleCislic);
return poleCislic;
}
int soucetCislic(int[] poleCislic)
//Metoda soucetCislic vrací součet pole číslic
public static int soucetCislic(int[] poleCislic)
{
int soucet = 0;
//Prochází pole a přičítá jednotlivé číslice
for (int i = 0; i < poleCislic.Length; i++)
{
soucet += poleCislic[i];
}
return soucet;
}
string zobrazCislice(int[] poleCislic)
//Metoda přidává jednotlivé prvky pole do StringBuilderu a nakonec jej vrací
public static string zobrazCislice(int[] poleCislic)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < poleCislic.Length; i++)
{
sb.Append(string.Format("{0}, ", poleCislic[i]));
}
return sb.ToString();
}
void Proved(object sender, EventArgs e)
//Použití metod na windowsovém formuláři
//rozkladoveCislo_TxtBox.Text = TextBox
//soucet_TxtBox.Text = TextBox
//cislice_TxtBox.Text = TextBox
private void Proved(object sender, EventArgs e)
{
//uloží číslo z textboxu
int rozkladoveCislo = int.Parse(rozkladoveCislo_TxtBox.Text);
//určí počet cifer z čísla pro definování velikosti pole
int pocetCifer = pocetCiferCisla(rozkladoveCislo);
//do poleCislic uloží rozložené číslice z čísla
int[] poleCislic = rozkladCislaNaCislice(rozkladoveCislo, pocetCifer);
//vypíše do textboxu součet číslic z poleCislic
soucet_TxtBox.Text = soucetCislic(poleCislic).ToString();
//zobrazí jednotlivé číslice
cislice_TxtBox.Text = zobrazCislice(poleCislic);
}
Doufám, že jsem popsal výše uvedené metody v komentářích dostatečně. Prakticky jde jen o užitečnou ukázku cyklu for,
místo obvyklého demo příkladu výpisu 'i' čísel. Samozřejmě výše uvedené ukázky nemusí a určitě nejsou jediným způsobem jak problém rozkladu čísla na číslice řešit. Pokud máte nějaké návrhy či připomínky rád si jej přečtu v komentářích či v mailu.
Doplněno po necelém roce dne 15.9.2009
- nebo to také celé jde dělat takto pomocí ArrayList(jak už to tak bývá, člověk se pořád zdokonaluje :)):
Console.Write("Zadejte cislo: ");
string vstup = Console.ReadLine();
int soucet = 0;
ArrayList list = new ArrayList();
foreach(char znak in vstup)
{
soucet += int.Parse(znak.ToString());
list.Add(znak);
}
Console.WriteLine("soucet: " + soucet.ToString());
Console.ReadLine();