Diskuze: Funkce pro převod znaku
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 44 zpráv z 44.
//= 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.
zkus se inspirovat tady
http://www.itnetwork.cz/…ace-se-znaky
nebo v jiném ze zdejších tutoriálů...
P.S. Trošku hledání jsi tomu věnovat mohl...
nevím co znamená přímé nahrazení, ale tady máš funkční:
static string GetConvertedChar(char c)
{
switch(c)
{
case 'a': return "1 ";
case 'j': return "1 ";
case 's': return "1 ";
case 'b': return "2 ";
case 'k': return "2 ";
case 't': return "2 ";
case 'c': return "3 ";
case 'l': return "3 ";
case 'u': return "3 ";
case 'd': return "4 ";
case 'm': return "4 ";
case 'v': return "4 ";
case 'e': return "5 ";
case 'ö': return "5 ";
case 'n': return "5 ";
case 'w': return "5 ";
case 'f': return "6 ";
case 'o': return "6 ";
case 'x': return "6 ";
case 'g': return "7 ";
case 'p': return "7 ";
case 'y': return "7 ";
case 'h': return "8 ";
case 'q': return "8 ";
case 'z': return "8 ";
case 'i': return "9 ";
case 'ü': return "9 ";
case 'r': return "9 ";
default: return c.ToString();
}
}
string ConvertStr(string str)
{
StringBuilder bu = new StringBuilder(str.Length * 2);
foreach (char c in str) bu.Append(GetConvertedChar(c));
return bu.ToString();
}
Ještě jedna a snad poslední otazka k funkci. Chci každé to číslo sečíst a dostat součet. Snažil jsem se toho docílit takhle:
ciselnySoucet += ConvertStr(text);
Chtěl jsem třeba i pomocí for() ale když mi nechce vzít +=, tak nevím jak jinak toho docílit. Omlouvám se, ale stále se učím i když to tak nevypadá
je to string, takže musíš s něj parsovat hodnotu.
Takže se nabízí otázka proč jsi rovnou nechtěl vracet hodnotu?
int GetConvertedChar(char c)
{
switch(c)
{
case 'a': return 1;
case 'j': return 1;
case 's': return 1;
........
a tu pak rovnou přičítat..
Ja tam tedy vidim, ze on dela defakto
number = ((int) character - 96) % 10; pokud to takto skutečně je,. nebylo by to asi jen tak 1000x lepší, než dělat nějakým lookup table (Dictionary / Asociativní pole), nebo nedejbože switch?
já ale nechápu jak to chceš vlastně přičítat.
Třeba jako tak, že za jednotlivé znaky dosadit čísla a ty pak sečíst?
on chce poste z jednotlivych cislic poskaldat zpet cislo a mit to jako cislo..
ciselnySoucet = ConvertStr(text) + ciselnySoucet;
.. a jako spravny PHPkar, nevi co je to immutable.
takže ne takto: ??
static int GetConvertedCharValue(char c)
{
switch (c)
{
case 'a': return 1;
case 'j': return 1;
case 's': return 1;
case 'b': return 2;
case 'k': return 2;
case 't': return 2;
case 'c': return 3;
case 'l': return 3;
case 'u': return 3;
case 'd': return 4;
case 'm': return 4;
case 'v': return 4;
case 'e': return 5;
case 'ö': return 5;
case 'n': return 5;
case 'w': return 5;
case 'f': return 6;
case 'o': return 6;
case 'x': return 6;
case 'g': return 7;
case 'p': return 7;
case 'y': return 7;
case 'h': return 8;
case 'q': return 8;
case 'z': return 8;
case 'i': return 9;
case 'ü': return 9;
case 'r': return 9;
default: return 0;
}
}
/// <summary>
/// získání hodnoty z textu:
/// </summary>
int GetValueFromString(string str)
{
int val = 0;
foreach (char c in str) val += GetConvertedCharValue(c);
return val;
}
ale takto?
private static string GetConvertedChar(char c)
{
switch(c)
{
case 'a': return "1";
case 'j': return "1";
case 's': return "1";
case 'b': return "2";
case 'k': return "2";
case 't': return "2";
case 'c': return "3";
case 'l': return "3";
case 'u': return "3";
case 'd': return "4";
case 'm': return "4";
case 'v': return "4";
case 'e': return "5";
case 'ö': return "5";
case 'n': return "5";
case 'w': return "5";
case 'f': return "6";
case 'o': return "6";
case 'x': return "6";
case 'g': return "7";
case 'p': return "7";
case 'y': return "7";
case 'h': return "8";
case 'q': return "8";
case 'z': return "8";
case 'i': return "9";
case 'ü': return "9";
case 'r': return "9";
default: return string.Empty;
}
}
public static int ConvertStr(string str)
{
StringBuilder bu = new StringBuilder(str.Length);
foreach (char c in str) bu.Append(GetConvertedChar(c));
int result;
int.TryParse(bu.ToString(), out result);
return result;
}
ten závěr raději takto:
public static int ConvertStr(string str)
{
StringBuilder bu = new StringBuilder(str.Length);
foreach (char c in str) bu.Append(GetConvertedChar(c));
int result;
return int.TryParse(bu.ToString(), out result) ? result : 0;
}
Ukázka použití v konzolové aplikaci:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Zadej text:");
string str = Console.ReadLine();
int val = ConvertStr(str);
Console.WriteLine(val.ToString());
Console.ReadKey();
}
private static string GetConvertedChar(char c)
{
switch (c)
{
case 'a': return "1";
case 'j': return "1";
case 's': return "1";
case 'b': return "2";
case 'k': return "2";
case 't': return "2";
case 'c': return "3";
case 'l': return "3";
case 'u': return "3";
case 'd': return "4";
case 'm': return "4";
case 'v': return "4";
case 'e': return "5";
case 'ö': return "5";
case 'n': return "5";
case 'w': return "5";
case 'f': return "6";
case 'o': return "6";
case 'x': return "6";
case 'g': return "7";
case 'p': return "7";
case 'y': return "7";
case 'h': return "8";
case 'q': return "8";
case 'z': return "8";
case 'i': return "9";
case 'ü': return "9";
case 'r': return "9";
default: return string.Empty;
}
}
public static int ConvertStr(string str)
{
StringBuilder bu = new StringBuilder(str.Length);
foreach (char c in str) bu.Append(GetConvertedChar(c));
int result;
int.TryParse(bu.ToString(), out result);
return result;
}
}
Domácí úkol to není
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Prvni_program
{
public partial class MainForm : Form
{
string txt1 = "Zde bude text.";
public MainForm()
{
InitializeComponent();
label1.Text = txt1;
}
public static string RemoveDiacritics(String s)
{
s = s.Normalize(System.Text.NormalizationForm.FormD);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < s.Length; i++)
{
if (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(s[i]) != System.Globalization.UnicodeCategory.NonSpacingMark)
{
sb.Append(s[i]);
}
}
return sb.ToString();
}
private static string GetConvertedChar(char c)
{
switch(c)
{
case 'a': return "1";
case 'j': return "1";
case 's': return "1";
case 'b': return "2";
case 'k': return "2";
case 't': return "2";
case 'c': return "3";
case 'l': return "3";
case 'u': return "3";
case 'd': return "4";
case 'm': return "4";
case 'v': return "4";
case 'e': return "5";
case 'ö': return "5";
case 'n': return "5";
case 'w': return "5";
case 'f': return "6";
case 'o': return "6";
case 'x': return "6";
case 'g': return "7";
case 'p': return "7";
case 'y': return "7";
case 'h': return "8";
case 'q': return "8";
case 'z': return "8";
case 'i': return "9";
case 'ü': return "9";
case 'r': return "9";
default: return string.Empty;
}
}
public static int ConvertStr(string str)
{
StringBuilder bu = new StringBuilder(str.Length);
foreach (char c in str) bu.Append(GetConvertedChar(c));
int result;
return int.TryParse(bu.ToString(), out result) ? result : 0;
}
void TextBox1TextChanged(object sender, EventArgs e)
{
string tx;
if(textBox1.Text != "ü" && textBox1.Text != "ö") tx = ConvertStr(RemoveDiacritics(textBox1.Text).ToLower()).ToString();
else tx = ConvertStr(textBox1.Text.ToLower()).ToString();
int soucet = 0;
soucet = ConvertStr(tx) + soucet;;
label1.Text = tx
if(textBox1.Text == "")
{
label1.Text = txt1;
}
}
}
}
V tom případě nevím jestli jsem to pochopil správně:
//int celkem = 0;
void TextBox1TextChanged(object sender, EventArgs e)
{
if (textBox1.Text == "") label1.Text = txt1;
else
{
int val;
if (textBox1.Text != "ü" && textBox1.Text != "ö") val = ConvertStr(RemoveDiacritics(textBox1.Text).ToLower());
else val = ConvertStr(textBox1.Text.ToLower());
//celkem += val;
label1.Text = val.ToString();
//label2.Text = celkem.ToString();
}
}
verzi s celkovým součtem jsem zakomentoval //
Do inputu vypisuji slovo a to převádím na čísla. Ty čísla potom chci přičíst aby mi vyšel součet. To co jsem narovinu okopíroval mi vypisuje pokud se přičítá po 1 (1,2,3,4). Myslel jsem si, že to bude lehčí a budu to mít za den napsaný. V PHP by jsem to měl za pár minut
takto nějak:
static int GetConvertedCharValue(char c)
{
switch (c)
{
case 'a': return 1;
case 'j': return 1;
case 's': return 1;
case 'b': return 2;
case 'k': return 2;
case 't': return 2;
case 'c': return 3;
case 'l': return 3;
case 'u': return 3;
case 'd': return 4;
case 'm': return 4;
case 'v': return 4;
case 'e': return 5;
case 'ö': return 5;
case 'n': return 5;
case 'w': return 5;
case 'f': return 6;
case 'o': return 6;
case 'x': return 6;
case 'g': return 7;
case 'p': return 7;
case 'y': return 7;
case 'h': return 8;
case 'q': return 8;
case 'z': return 8;
case 'i': return 9;
case 'ü': return 9;
case 'r': return 9;
default: return 0;
}
}
public static string ConvertStr(string str, out int hodnota)
{
int i, val = 0;
StringBuilder bu = new StringBuilder(str.Length * 2);
foreach (char c in str)
{
i = GetConvertedCharValue(c);
val += i;
bu.Append(i.ToString());
bu.Append(',');
}
hodnota = val;
return bu.ToString();
}
void TextBox1TextChanged(object sender, EventArgs e)
{
if (textBox1.Text == "") label1.Text = txt1;
else
{
int soucet;
if (textBox1.Text != "ü" && textBox1.Text != "ö") Text = ConvertStr(RemoveDiacritics(textBox1.Text).ToLower(), out soucet);
else Text = ConvertStr(textBox1.Text.ToLower(), out soucet);
label1.Text = soucet.ToString();
}
}
pokud jsem to zase nepochopil tak zkos uvést konkrétní příklady zadání a výsledek toho co se má vypočítat a zobrazit
A presne takto vznikaji velmi povrchni nazory na PHP a na konkurenci.. V PHP by si neudelal hlavne ani konzolovou aplikaci, která je event based.., natož desktopovou. Ten kod co potrebujes udělat jsi schopný i v .NET udělat na pár řádek pomocí Dictionary a primitivniho eventu, To ale neznamená, že to tak bude správné...
Doporučili ti tady například něco, čemu se říká StringBuilder, což je na první pohled "zbytečných" X řádek navíc.. Ale má to svůj důvod.. String je immutable, jako ve velkém počtu jazyků a tak se při každé změně vytváří nová instance, alokuje se paměť a ta se pak někdy musí i uvolnit..
Navíc pokud ten string bude opravdu dlouhý (>84kb), tak se s tou pamětí zachází jinak, protože jde do jiného místa.. Z toho důvodu existuje něco jako stringbuilder...
PHP má téměř vše "superefektivně" uložené vnitřně jako dictionary.. Protože v php No one gives a fuck, že to mohlo jet 100ms, když 5 vteřin je přeci "v pohodě".
Já tě jen prosím ať se vyvaruješ podobných názorů
Zkus sepsat celé zadání čeho se snažíš docílit a společně ti poradíme jak to udělat. Případně hoď klině někam zdrojáky a někdo ti to tam dopíše (třeba já).
pokud nestojíš o výpis toho formátovaného textu ale pouze o součet, tak se to dá zjednodušit:
....
case 'z': return 8;
case 'i': return 9;
case 'ü': return 9;
case 'r': return 9;
default: return 0;
}
}
public static int ConvertStr(string str)
{
int hodnota = 0;
foreach (char c in str) hodnota += GetConvertedCharValue(c);
return hodnota;
}
void TextBox1TextChanged(object sender, EventArgs e)
{
if (textBox1.Text == "") label1.Text = txt1;
else
{
if (textBox1.Text != "ü" && textBox1.Text != "ö") label1.Text = ConvertStr(RemoveDiacritics(textBox1.Text).ToLower()).ToString();
else label1.Text = ConvertStr(textBox1.Text.ToLower()).ToString();
}
}
Chci se jen zeptat ještě na rozložení celého čísla. Třeba je součet 25, tak jak můžu rozdělit ještě tyhle dvouciferná čísla na jednociferná aby jsem je mohl případně sečíst? Omlouvám se, že se vracím k tomuto vláknu, ale myslím si, že to sem ještě patří. Děkuji
Takže pokud chceš mít z čísla 25 číslo 7, tak třeba takto:
static int Sum(int val)
{
string str = val.ToString();
int result = 0;
foreach(char c in str)
{
result += (c - '0');
}
return result;
}
ještě se to dá dát přímo do té metody:
static int Sum(int val)
{
string str = val.ToString();
int result = 0;
foreach(char c in str)
{
result += c - '0';
}
return result<10 ? result : Sum(result);
}
Co třeba si pročíst místní tutoriály? Jak chceš programovat bez základních znalostí?
string txt = "bumerang";
//se stringem se pracuje jako s polem
char pismenoB = txt[0];
Zobrazeno 44 zpráv z 44.