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#