Професионална програма
Loading...
+ Нов въпрос
Simooo93 avatar Simooo93 81 Точки

[Homework] Advanced C# - Strings and Text Processing

Здравейте колеги,

 

Тъй като най-накрая се научих да използвам GitHub реших да дам своите решения на задачите от "стрингове и текстообработка". 

Ето задачите: 

1. Reverse String;

2. String Length;

3. Count Substring Occurences;

4. Text Filter;

5. Unicode Characters

6. Palindromes

7. Letters Change Numbers

Ще съм благодарен, ако дадете някакво ревю за задачите. На 7-ма задача хващам 90 точки в judge-а, явно хвърля exception на първи тест, но не мога да разбера защо. 

Тагове:
3
Fundamentals Module 29/09/2015 14:15:03
Filkolev avatar Filkolev 4486 Точки

На 7-ма сплитваш, но не хващаш случая, когато има спейс в началото или края на стринга. Тримни инпута преди да го сплитнеш.

 

0
IlianStefanov avatar IlianStefanov 12 Точки

Здравей колега и аз използвах това домашно, за да се поупражня с ъплоудване в GitHub

извинявам се, че не съм номерирал задачите, а ето и домашното.

Ако има грешки, които не съм забелязал, може ли да ги обсъдим и същевременно да ги оправим

Благодаря!

2
25/09/2015 01:21:01
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей, Илияне,

Домашното ти е много интересно направено.

За първа задача (Reverse String) аз да си призная дори не знаех че char array може да се печата директно - а и из форуми не съм го виждала досега. Пета задача (Unicode Characters) също е много интересно направена.

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

За четвърта задача (Text Filter) този масив не ти трябва, тъй като всяка от забранените думи я ползваш еднократно. Във C# string.Replace() метода прави замените навсякъде, не само на първия match, който намери.

            //string[] bannedSymbols = new string[wordsToBeBanned.Count()];

В задачата Letters Change Numbers, на този ред string[] inputLine = Console.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries).ToArray();

.toArray() е излишно, защото ако не парсваш или променяш елементите на колекцията след string.Split(), така или иначе винаги си получаваш string[] като резултат.

А ако изведеш методи, както си направил при други задачи - програмата може да стане с 20 реда по-кратка.

http://pastebin.com/r0bc5Ujf

 

0
IlianStefanov avatar IlianStefanov 12 Точки

Благодаря за feedbacka, ще имам предвид съветите ти. :)

Ще поправя домашното си на базата на твоите предложения.

0
kidroca avatar kidroca 117 Точки

Ето още малко решения

Example

 

0
26/09/2015 15:46:28
cap7ainjack avatar cap7ainjack 20 Точки

На 6-та Palindromes,

трябва да се принтира със space-ве преди "ABBA", както се вижда от примера, твоето е без и моето също е така не знам как се оправя.

Ето го моето решение на 6-та

http://pastebin.com/ddsPuQyQ

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

Започвам да си мисля, че String Builder-a не е най-доброто решение за тази задача или поне аз не знам как да направя това празното място пред "ABBA" да си остане там.

 

Това са всички решения по тази тема:

https://github.com/cap7ainjack/Adv_C-_Homework_3_Strings-and-Text-Processing/tree/master/3_strings_and_text

 

0
27/09/2015 10:14:56
kidroca avatar kidroca 117 Точки

Здравей,

за 6та задача по - важното е да откриеш/извадиш палиндромите.

ползваш StringBuilder по неудобен начин, това което правиш със StringBuilder-a  излишно ти усложняваш работата, защото го правиш на стринг, а после го split-ваш по ' ',  просто си направи един SortedSet<string> palindromes и когато:

 string reversed = StringReverser(array[i]);

прави palindromes.Add(array[i]);

така когато искаш да ги принтираш накрая може да използваш

string result = string.Join(", ", palindromes);

ако искаш да са разделени от повече от един space, може да използваш ",\t" или ",   " вместо ", ".

Истината е че в отговора на домашното space-ът е само един просто в колонката Output текстът е подравнен със Justify, копирай резултатът от Output във един notepad и ще видиш че разтоянието между думите е ", ".

1
27/09/2015 13:07:12
cap7ainjack avatar cap7ainjack 20 Точки

Е добре, така може :D

Мерси отново!

Иначе от мерак да пробвам strign builder-a го напраих така, но ще го махна.

0
vanndann avatar vanndann 1 Точки

 Здравей,

На 4та задача трябва да имаш на предвид и "space"са, защото той ти променя следващата "hidenwords" т.е. става "_Windows", a трябва да е "Windows" . С твоето решение имаш 1 "*" отпред повече след първата ключова дума. Надявам се да си ме разбрал!

Успех!

1
vanndann avatar vanndann 1 Точки

Здравей,

Според мен на трета задача трябва да следиш и за малки и главни букви. Просто добави в началото:

string text = Console.ReadLine().ToLower();
string subtext= Console.ReadLine().ToLower();

Иначе всичко е ОК.

0
IvanAndonov avatar IvanAndonov 5 Точки

Колега, свършил си страхотна работа, но не разбирам защо с Copy-Paste на 4-та задача, същата не работи при мен (не се получава само Replace-a с '*' ). Погледнах да не съм затрил някоя библиотека, но явно не е това...

п.с. Предварително се извинявам за невежеството си :)

0
Simooo93 avatar Simooo93 81 Точки

Здравей, 

 

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

 

Поздрави,

Симо

0
IvanAndonov avatar IvanAndonov 5 Точки

Здравей,

Внушението ти с характер на извод, че не разбирам достатъчно добре кода на решението ("..така и без това ще разбереш много по-добре какво се случва") не е коректно!

От конкретният ти отговор ("..и на мен ми се е случвало, но не знам защо.") изглежда, че си наясно с това, че задачата не е напълно решена, а въпросът ми беше дали можем да стигнем до завършено решение, което да работи във всички случаи ?

Все пак, благодаря за отговора!

Поздрави,

И

0
IvanAndonov avatar IvanAndonov 5 Точки

Ето колега, това трябва да е решението:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TextFilter
{
    class TextFilter
    {
        static void Main(string[] args)
        {
            string[] separator = new string[] { ",", " " };
            string[] bannedWords = Console.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries);

            StringBuilder text = new StringBuilder (Console.ReadLine());
            string[] stars = new string[bannedWords.Length];

            for (int i = 0; i < bannedWords.Length; i++)
            {
                stars[i] = new string('*', bannedWords[i].Length);
                text.Replace(bannedWords[i], stars[i]);
            }
            Console.WriteLine(text);
        }
    }
}

Поздрави,

И

5
bacuty avatar bacuty 55 Точки

https://github.com/VasilenaDragancheva/ExamSolutions

Ето моите решения на задачите от изпитите :) там е и 7ма.

Бих се радвала ако някой му се гледа да ме критикува... Понеже имам нужда от градивна критика за качество на кода :)

1
28/09/2015 16:49:26
kidroca avatar kidroca 117 Точки

Здравей, 

Понеже поръча критика относно качеството на кода, най - ярко впечетление ми направи следното (Става дума за 7ма задача от това домашо "Leters Change Numbers"):

if (letterBefore >= 'A' && letterBefore <= 'Z')
{
    currentSum = number / (-'A' + letterBefore + 1);
}
else if (letterBefore >= 'a' && letterBefore <= 'z')
{
    currentSum = number * (-'a' + letterBefore + 1);
}
if (letterAfter >= 'A' && letterAfter <= 'Z')
{
    currentSum -= (-'A' + letterAfter + 1);
}
else if (letterAfter >= 'a' && letterAfter <= 'z')
{
    currentSum += (-'a' + letterAfter + 1);
}

Няма място между първият и вторият if-else блок и на пръв поглед може да се объркаш че са един блок, за да не се получава така е прието след края на всеки блок (общо взето всичко което има { } - for, if, wile, method etc... ) от код да се оставя по един празен ред освен ако на следващия ред не се пада } - затварящата скоба на по - горен блок. (В случея else if-a е част от if блок-а и между тях не трябва да има място, краят на този блок е затварящата скоба на else if-a })

Следващото нещо е  -'A' + letterBefore + 1 това е равносилно на letterBefore -'A' + 1 , което се чете по - лесно.

Иначе като цяло имената са добре подбрани и лесно се разбира какво става

Отделно от това има някой папки в репозиторито ти които биха се радвали на друго име, като ArraySlider1, BinarySearch1 etc.

вместо "1" там трябва да има думи или две от които da става ясно по - какъв начин това е по различно от ArraySlider или BinarySearch, ако все пак не може да намериш по - подходящо име BinarySearchAlternative е по - добре.

Успех!

0
29/09/2015 00:02:21