Avatar
Frestyle
Člen
Avatar
Frestyle:

Dobrý den,

snažím se docílit převod znaku. V php jsem to dělal viz. níže. Prosím, jak stejného efektu docílit v C#? Předem moc děkuji za rady. Zkoušel jsem to pomoci funkce replace, ale ta dokáže jen jeden znak/slovo.

function prevod($text){$preved = array("a" => "1 ","j" => "1 ","s" => "1 ","b" => "2 ","k" => "2 ","t" => "2 ","c" => "3 ","l" => "3 ","u" => "3 ","d" => "4 ","m" => "4 ","v" => "4 ","e" => "5 ","ö" => "5 ","n" => "5 ","w" => "5 ","f" => "6 ","o" => "6 ","x" => "6 ","g" => "7 ","p" => "7 ","y" => "7 ","h" => "8 ","q" => "8 ","z" => "8 ","i" => "9 ","ü" => "9 ","r" => "9 ");return strtr($text,$preved);}
 
Odpovědět 2. října 9:04
Avatar
Odpovídá na Frestyle
Michal Štěpánek:

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...

Nahoru Odpovědět 2. října 9:23
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Frestyle
Člen
Avatar
Frestyle:

Tohle jsem vyhledal, ale nic moc mi to nedalo. Potřebuji přímé nahrazení viz funkce v php. Zkoušel jsem i Replace, ale to se už opakuju

 
Nahoru Odpovědět 2. října 14:06
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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();
}
 
Nahoru Odpovědět 2. října 15:12
Avatar
Frestyle
Člen
Avatar
Frestyle:

To je přesně ono. Moc děkuju

 
Nahoru Odpovědět 2. října 20:13
Avatar
Frestyle
Člen
Avatar
Frestyle:

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á

 
Nahoru Odpovědět 2. října 20:38
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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..

Editováno 2. října 20:50
 
Nahoru Odpovědět 2. října 20:48
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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?

 
Nahoru Odpovědět 2. října 20:58
Avatar
Frestyle
Člen
Avatar
Frestyle:

Opravil jsem string (case) na int a kde tedy prosím vytvořit přičítání?

 
Nahoru Odpovědět 2. října 20:59
Avatar
HONZ4
Člen
Avatar
Odpovídá na Marian Benčat
HONZ4:

částečně, nesedí tam 'ö' a 'ü'

 
Nahoru Odpovědět  +1 2. října 21:03
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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?

 
Nahoru Odpovědět 2. října 21:05
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na HONZ4
Marian Benčat:

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.

 
Nahoru Odpovědět 2. října 21:10
Avatar
Frestyle
Člen
Avatar
 
Nahoru Odpovědět 2. října 21:16
Avatar
HONZ4
Člen
Avatar
HONZ4:

kdyby vstupem byla trochu delší věta bude v pr.eli

 
Nahoru Odpovědět 2. října 21:17
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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;
}
 
Nahoru Odpovědět 2. října 21:18
Avatar
HONZ4
Člen
Avatar
HONZ4:

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;
}
Editováno 2. října 21:26
 
Nahoru Odpovědět 2. října 21:24
Avatar
HONZ4
Člen
Avatar
HONZ4:

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;
}
 
Nahoru Odpovědět 2. října 21:29
Avatar
HONZ4
Člen
Avatar
HONZ4:

to je vlastně jedno :)

 
Nahoru Odpovědět 2. října 21:35
Avatar
Frestyle
Člen
Avatar
Frestyle:

Tahle kombinace funkcí mi vyhazuje toto: Typ int nelze implicitně převést na typ string. (CS0029)

 
Nahoru Odpovědět 2. října 21:37
Avatar
HONZ4
Člen
Avatar
HONZ4:

to bys musel dát ukázku použití.

takhle ti můžu poradit jen .ToString()

 
Nahoru Odpovědět 2. října 21:48
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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;
    }
}
Editováno 2. října 21:58
 
Nahoru Odpovědět 2. října 21:55
Avatar
Frestyle
Člen
Avatar
Frestyle:

.ToString() skutečně zabralo, ale kam prosím dosadit přičítání?

 
Nahoru Odpovědět 2. října 21:58
Avatar
HONZ4
Člen
Avatar
HONZ4:

Hele pokud to není domácí úkol, tak sem klidně dáš ukázku svého kódu ať ti můžu poradit, v opačném případě ti to dávám za domácí úkol já ;)

 
Nahoru Odpovědět 2. října 22:02
Avatar
Frestyle
Člen
Avatar
Frestyle:

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;
                        }
                }
        }
}
 
Nahoru Odpovědět 2. října 22:13
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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 //

 
Nahoru Odpovědět 2. října 22:32
Avatar
HONZ4
Člen
Avatar
HONZ4:

textBox1.Text != "ü"

tato část mi napovídá, že znaky do editu zadáváš maximálně po jednom. Pokud je to tak, tak by se to mohlo celé udělat jinak.

 
Nahoru Odpovědět 2. října 22:38
Avatar
Frestyle
Člen
Avatar
Frestyle:

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 :-(

 
Nahoru Odpovědět 2. října 22:50
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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

 
Nahoru Odpovědět 2. října 23:15
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Frestyle
Marian Benčat:

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á).

 
Nahoru Odpovědět  +1 2. října 23:19
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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();
            }
        }
Editováno 2. října 23:25
 
Nahoru Odpovědět 2. října 23:24
Avatar
Frestyle
Člen
Avatar
Frestyle:

Děkuji všem moc mi to pomohlo při vývoji a něco nového jsem se přiučil

 
Nahoru Odpovědět 3. října 0:07
Avatar
Frestyle
Člen
Avatar
Frestyle:

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

 
Nahoru Odpovědět 3. října 20:57
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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;
        }
Editováno 3. října 21:34
 
Nahoru Odpovědět 3. října 21:33
Avatar
Frestyle
Člen
Avatar
Frestyle:

Mi to vypisuje: Typ int nelze implicitně převést na typ string. (CS0029)

 
Nahoru Odpovědět 3. října 21:39
Avatar
HONZ4
Člen
Avatar
 
Nahoru Odpovědět 3. října 21:40
Avatar
Frestyle
Člen
Avatar
Frestyle:

jj, funguje to správně a jen se chci zeptat na poslední věc. Pokud je součet třeba 10, tak jak z toho udělat jen jedničku? Můžu to dělat pomocí podmínky, ale chci se zeptat zda to nejde přímo v té funkci. Omlouvám se, ale zajímá mě to

 
Nahoru Odpovědět 3. října 21:43
Avatar
HONZ4
Člen
Avatar
HONZ4:

však ta funkce z 10ti přece udělá jedničku..

 
Nahoru Odpovědět 3. října 21:46
Avatar
Frestyle
Člen
Avatar
Frestyle:

to ano, ale když je třeba 28, tak mi to vypíše 10. Myslím to tak, že by nevypsal 10,ale 1

 
Nahoru Odpovědět 3. října 21:47
Avatar
HONZ4
Člen
Avatar
HONZ4:

můžeš to přece zavolat 2x:

int total = Sum(199914);
if (total > 9) total = Sum(total);
Label1.Text = total.ToString();
Editováno 3. října 21:55
 
Nahoru Odpovědět 3. října 21:53
Avatar
Frestyle
Člen
Avatar
Frestyle:

To je pravda. Děkuju a přeji příjemný večer

 
Nahoru Odpovědět 3. října 21:56
Avatar
HONZ4
Člen
Avatar
Odpovídá na Frestyle
HONZ4:

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);
}
 
Nahoru Odpovědět 3. října 22:00
Avatar
Frestyle
Člen
Avatar
Frestyle:

Už je mi to trapný, ale mám ohledně těhle věcí poslední dotaz a to: Jak si vytáhnout jen první písmeno. Například napíšu bumerang a jak vytáhnu jen b? Vím, že jsem už otravný a určitě už dostanu adresu do patřičných míst, ale zajímá mě to.

 
Nahoru Odpovědět 4. října 15:40
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Frestyle
Lukas C#:

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];
 
Nahoru Odpovědět  +1 4. října 15:43
Avatar
Frestyle
Člen
Avatar
Frestyle:

Ještě jednou děkuji. Obdobně jsem to psal, ale vyhazovalo mi to chybu.

 
Nahoru Odpovědět 4. října 16:05
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 44 zpráv z 44.