Diskuze: Převod pozice ve string na int
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Chyba:
//Convert.ToInt32(a[b]);
Convert.ToInt32(b)
Kód by mohl vypadat nějak takhle:
int letters = 0, digits = 0, total = 0;
foreach (char ch in a)
{
if (char.IsDigit(ch))
{
digits++;
total += Convert.ToInt32(ch);
}
else if (char.IsLetter(ch))
letters++;
}
Console.WriteLine($"Číslice zabírají: {(float)digits * 100 / a.Length}% ze zadaného řetezce");
Console.WriteLine($"Písmena zabírají: {(float)letters * 100 / a.Length}% ze zadaného řetezce");
Console.WriteLine($"Součet číslic: {total}");
ahoj
spíše něco k zamyšlení....
a řeší se číslo nebo číslice? z mého pohledu je v tom docela rozdíl...
třeba ve stringu 'ahoj 123 +-/' je celkem znaků 12, alfabetických 4,
numerických (číslicových) 3, speciálních 3, mezer 2, slov 1, čísel 1,
skupin spec. znaků 1
potom % zastoupení číslic je 3/12 a jejich součet 6
ale % zastoupení čísel je 1 z ? toto nedává úplně smysl, jedině v
případě, že by se ostatní části považovaly třeba za slova/skupiny ...
tj.. 1/3 ze všech skupin ..1x slovo ahoj, 1x číslo 123, 1x skupina znaků
+-/
nevím jak je C# řešeno, ale z jiného jazyku mám třeba zkušenost s tím,
že je potřeba u funkcí, které počítají znaky dbát i na
kódování...
tj. pokud by vstup byl třeba v utf-8, ale funkce by si myslela, že string je v
kódování 1250 tak v případě českých znaků dojde ke špatným
výsledkům...
Konverzi číslice reprezentované jako znak na jeho číselnou hodnotu provedeš pomocí výrazu (C notace):
c - '0' nebo c - 48 (první způsob je lepší).
kde c představuje znak v rozsahu ASCII 48 až 57 (0 = 48, ..., 9 = 57). Výsledek výrazu je číselná hodnota konvertovaného znaků, kterým je číslo.
@Michael Skrášek: bohužel tvůj kód mi nefunguje. Při napsání: a2 mi jako odpověď součtu vyleze číslo 50, obdobně při vstupu více čísel. Je tam jakési prolínání s číslem 50...
@Tomáš Novotný: také jsem na to myslel, nicméně je to myšleno jako jedna číslice tzn od 0 do 9.
@Jan Mareš: takto mi to také bohužel nejde, převede mi to pouze celý řetězec na jedno číslo s písmenky
@DarkCoder: bohužel nevím jak to myslíš, můžeš prosím napsat
příklad přímo v nějakém krátkém kódu ?
Konverze číslice 2 z char na int.
(Kód psán v C)
char buff[] = "Test123";
int val = buff[5] - '0';
Proměnná val nyní obsahuje hodnotu 2.
Jo, menší chybka:
//Convert.ToInt32(ch);
int.Parse(ch.ToString());
Když to tak napíšu, tak mi píše, že index je mimo hranice pole. Proměnná a je typu string a je to pro mě ten vstupní řetězec.
foreach (char b in a)
{
if (cisla.Contains(b))
{
int pom = a[b] - '0';
soucet = pom + soucet;
pocetcisel++;
}
if (pismena.Contains(b))
pocetpismen++;
Děkuji, v této podobě kód již funguje jak má:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Zadej libovolnou kombinaci čísel a písmen");
string a = Console.ReadLine();
a = a.ToLower();
int pocetcisel = 0;
int pocetpismen = 0;
int soucet = 0;
string cisla = "0123456789";
string pismena = "aábcčdďeéěfghiíjklmnňoópqrřsštťuůúvwxyýzž ";
foreach (char b in a)
{
if (cisla.Contains(b))
{
soucet += int.Parse(b.ToString());
pocetcisel++;
}
if (pismena.Contains(b))
pocetpismen++;
}
Console.WriteLine();
Console.Write("Číslice zabírají: " + (float)pocetcisel * 100 / a.Length + "% ze zadaného řetezce");
Console.WriteLine();
Console.Write("Součet číslic je: " + soucet);
Console.ReadLine();
Meze máš ošetřené podmínkou cyklu, přístup k hodnotám na daném indexu se provádí nepřímo pomocí ukazatele. Zde je pak ukázka a důkaz toho, že výraz c - '0' platí. Kód opět v jazyce C.
// Zde načtení řetězce str
ndigits = 0;
sum = 0;
while (*pstr) {
if ((*pstr >= '0') && (*pstr <= '9')) {
ndigits++;
sum += (*pstr - '0');
}
pstr++;
}
kde pstr je ukazatel na vstupní řetězec str, ndigits představuje počet číslic v řetězci str a sum součet číslic v řetezci str. Rozdíl ukazatelů představuje délku řetězce a tedy procentuální zastoupení číslic v řetězci je pak dáno vztahem:
(ndigits / (float)(pstr - str)) * 100
Přetypování jednoho z operandů je nutné z důvodu zamezení celočíselného dělení.
Tenhle kód by samozřejmě měl fungovat ... jen menší chybka:
//int pom = a[b] - '0';
int pom = b - '0';
Zobrazeno 13 zpráv z 13.