[C#] Домашно Strings and Text Processing - 14 задача


5

Условие: A dictionary is stored as a sequence of text lines containing words and their explanations. Write a program that enters a word and translates it by using the dictionary.

Sample dictionary:

.NET - platform for applications from Microsoft
CLR - managed execution environment for .NET
namespace - hierarchical organization of classes

Решениеsource.

Обяснение: Разделяме стринга на две спрямо символа "". Аз съм взел предвид, че може и в превода да се съдържа същия символ. Речникът е сортиран и може да се търси и по-бързо от линейно.

P.S. Символът на презентацията е тире "", а не е минус ("-"). Ако не виждате разликата ги пуснете в 10 задача. Отне ми десетина минути, докато разбера защо не ми работи решението.




Отговори



0

Решение:

http://pastebin.com/Kd3qvbuR

Обяснение:

Не съм много сигурен, че това се иска от задачата но работи, казваш коя дума искаш, след което получаваш нейното значение.

Написал съм доста просто и кратко решение

1. Създавам 2 string[ ] масива - words и descriptions. В words пазя думите, а в descriptions тяхното описание. Като индексите им съвпадат. Например ако CLR е на 2-ри индекс в word масива, следователно обяснението му ще бъде на същият индекс в descriptions масива.

2. След това чета от конзолата на коя дума искам значнието.

3. Пускам for цикъл до words.Length и ако намеря съвпадение на input-а с някоя дума от масива words. Тогава изписвам думата и нейното обяснение.

Пример:

for (int i = 0; i < words.Length; i++)
        {
            if (input == words[i])
            {
                Console.WriteLine("{0} - {1}",words[i],description[i]);
            }
        }

 

Асси

 


от Assi.NET (3050 точки)


0
Е то тогава най-лесно с истински речник: http://pastebin.com/RZpi7GyC :) Мисля, че целта на задачата е да упражним парсването на низовете.

от jasssonpet (6814 точки)

0
Еми аз не знаех що речник и си измислих някакъв ;) Все пак вече научих от примера ти как се ползва речник.Супер доста просто изглежда Пак благодаря а иначе ще се опитам да го парса утре по някое време

от Assi.NET (3050 точки)


2

Моето решение е без регулярни изрази, без речници в смисъла на езика C#, използвам IndexOf.

Речника ми представлява масив от стрингове, който обхождам с foreach цикъл, и ако исканата дума се среща в началото, отпечатвам съотвения елемент от речника.

http://pastebin.com/Y5BDe7RX

Ето и подобрения вариант, благодарение на jasssonpet.

http://pastebin.com/R9L2t4KU




0
Здравей, решението няма да работи, ако търсиш Java например, а в речника няма Java, но има JavaScript. Тъй като започват с една и съща част, ще се върне дефиницията на JavaScript. Може да добавиш примерно: IndexOf(word + " - ") за да хванеш и този случай.

от jasssonpet (6814 точки)

0
Благодаря, готово, оправих го.




0

Ето едно малко по-различно решение с отделни регулярни изрази за думата и дефиницията й. В момента на намиране на думата се извежда дефиницията й и се прекратява търсенето. Коментарите са в решението.

http://pastebin.com/h7R2kpGh


от shristoff (747 точки)


1

Решение с Dictionary и търсене по ключ.




0

Решение и от мен: http://pastebin.com/8Bnz8i3j

- разделям стринга в масив по '-' и '\n' след което го Trim-вам

- в цикъл, който обикаля всички четни елементи, търсиме въведената дума

- ако има съвпадение се печата следващата нечетна дума(израз), в противен случай печатаме, че няма подобна дума

Въпрос: как мога да Trim-вам директно елементи, а не по такъв идиотски начин с цикъл?


от Mitko_Mitev (1276 точки)


0
Може първо да го сплитнеш по "\n" и после да го сплитнеш по " - ", с интервалите.

от jasssonpet (6814 точки)


1

Съвсем набързо разгледах речниците и се пробвах да реша така задачата. Направих търсенето да не зависи от регистъра на буквите и да хваща грешката, когато я няма думичката в речника. Хубава задачка за начало на речници.

http://pastebin.com/7Cu515EB


от sylviapsh (302 точки)


0

Аз лично го направих с речник и така да се каже го упражних и може би разбрах:

http://pastebin.com/dyNV61Mf

 




0
Здравей, речникът наистина е много полезна структура. Само една забележка, че трябва да сплитваш по " - ".

от jasssonpet (6814 точки)


0

мм да речниците са добро решение за тази задача ето го и моето - http://pastebin.com/4NK1hpUd


от ge_or_gi (110 точки)


0
Ето още едно решение с речници, доста опростен вариант
http://pastebin.com/9DAwt80C

от Ognyan.Petkov (1044 точки)


0
този цикъл foreach никак не стои добре. Има си готов метод при работа с речници за проверка дали речника съдържа елемент с търсения ключ.
if (Dictionary.ContainsKey(word)){...}
Ако все пак държиш да е с цикъл foreach имай в предвид че така както си го написал, цикъла излишно проверява абсолютно всички елементи на речника. Поне сложи в даден момент , като намери съвпадение един break; и още нещо - в момента за всяко несъвпадение ти изписва - не е намерен, не е намерен, не е намерен....

от pdrenovska (2196 точки)


1

http://pastebin.com/bby40EAK

още едно решение с използване на Dictionary<string, string>, подканяйки потребителя да добави значението на думата в речника, ако не я е намерил. Може да се оптимизира още малко - например да чете от файл, и да добавя нови думи във файл...


от pdrenovska (2196 точки)


0
Тъй като решението ми е подобно имам един въпрос.Как може да направим търсенето да не зависи от главни или малки букви?

от borro (15 точки)

0
въпрос на място! конструкторът по подразбиране на класа Dictionary, прави обект, в който ключовете са чувствителни към главен и малък регистър. За да станат case-insensitive, се използва следният параметър при извикване на конструктора.
var SomeDict=new Dictionary

от pdrenovska (2196 точки)