IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Prevod na čísla zadané textom v ASP.NET MVC

Zadania

Vytvorte webovú aplikáciu v ASP.NET MVC, ktorá vypočíta modus (najčastejšie sa vyskytujúce prvok) z čísel zadaných vo formulárovom poli. Čísla sú zadané slovami a sú vždy do 100, oddelená sú čiarkou.

Ak je módov viac, napr. Pre vstup:

sto, padesát šest, dvacet, sto, padesát šest

budú vypísané všetky, tu teda 100, 56.

Moje riešenie neberie ohľad na diakritiku a funguje pre rozsah čísel 0-199. Súťažná verzia ešte nemala ošetrené chybnej prevody reťazcov "tridsat dvadsať", "jedenásť jedenásť" a pod. (Hodnoty sa sčítali)

Moje riešenie

Najskôr som si musel prejsť 3 tutoriály na MVC 1 2 3. Po základnom návrhu štruktúry MVC som sa pustil do kódovania v triede ModusModel.

Pre prevod slovne zadaných čísel mňa ako prvý napadlo využitie prípon a koreňov slov číslic. Tým som docielil "púhych" 25 reťazcov na porovnávanie, ktoré som uložil do slovníka.

dicFirstNumber.Add("nula", 0);
dicFirstNumber.Add("jedna", 1);
dicFirstNumber.Add("jede", 1);
dicFirstNumber.Add("dva", 2);
dicFirstNumber.Add("dve", 2);
dicFirstNumber.Add("tri", 3);
dicFirstNumber.Add("ctyri", 4);
dicFirstNumber.Add("ctr", 4);
dicFirstNumber.Add("pade", 5);
dicFirstNumber.Add("pet", 5);
dicFirstNumber.Add("pat", 5);
dicFirstNumber.Add("sest", 6);
dicFirstNumber.Add("sede", 6);
dicFirstNumber.Add("sedum", 7);
dicFirstNumber.Add("sedm", 7);
dicFirstNumber.Add("osum", 8);
dicFirstNumber.Add("osm", 8);
dicFirstNumber.Add("devate", 9);
dicFirstNumber.Add("devade", 9);
dicFirstNumber.Add("devet", 9);
dicFirstNumber.Add("deset", 10);

dicSecondNumber.Add("cet", 10);
dicSecondNumber.Add("nact", 1);
dicSecondNumber.Add("sat", 10);

dicThirdNumber.Add("sto", 100);

O to zložitejšie potom bolo ošetriť, aby chybne zadané čísla bola odhalená.

Postup

Vstupný reťazec sa rozdelí na reťazca oddelené čiarkou. Jedno číslo sa potom podľa medzier rozdelí na jednotlivé časti (napr. "Dvadsať jedna" na "dvadsať", "jedna"). Text sa postupne testuje, či obsahuje reťazca zo slovníkov, a to od najvyšších hodnôt po najmenšie. Po zistení hodnoty celého čísla sa tieto hodnoty testujú vo funkcii CheckResults, či sú korektné. Ak je nájdená chyba, vypíše sa, na ktorej pozícii sa nachádza.

private bool CheckResults(int[] results)
{
    if (results.Length == 1) return true; //pokud se jedna o pouze jedno cislo, tak se nemusi nic dal resit

    if (results[0] != results.Max() || results[results.Length - 1] != results.Min()) //osetreni, ze cisla jsou serazena zleva doprava podle velikosti
    {
        return false;
    }

    if (results.Contains(10))//pokud obsahuje cislo 10
    {
        if (results.Length == 3 || results[0] != 100) // cislo 10 muze byt pouze v kombinaci cisla 100
        {
            return false;
        }
    }

    if (results.Length == 3)// aby proslo sto devadesat devet - kontroluji se hodnoty... neprojde tricet, dvacet, deset
    {
        if (results[0] == 100 && results[1] < 100 && results[1] > 19 && results[2] < 10)
        {
            return true;
        }
        else return false;
    }

    if (results.Length == 2)
    {
        if ((results[0] == 100 && results[1] < 100) || (results[0] > 19 && results[1] < 10))
        {
            return true;
        }
        else return false;
    }

    return true;
}

Samotný výpočet hodnoty modus:

private void CountModus()
{
    StringBuilder sb = new StringBuilder();
    int max = dicResult.Values.Max();
    dicResult.Where(v => v.Value == max).Select(v => v.Key).ToList().ForEach(v => sb.Append(v + ", "));
    sb.Remove(sb.Length - 2, 2);
    OutputString = sb.ToString();
}

Galéria


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 127x (5.99 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
Základy ASP.NET MVC
Preskočiť článok
(neodporúčame)
Prvá webová aplikácia v ASP.NET MVC
Program pre vás napísal Petr Domes (petrds)
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programuji v .NET. Ovládám C#, .ASP, WF, WPF, SQL
Aktivity