Меню

Първи стъпки в правене на сайтове

Влез Излез

Тестване на палиндроми – част 1

Това е стандартна задача, която често се дава за пример при ученето на някакъв език за програмиране.

Самата задача стимулира мисленето при търсене на начин да се реши и често води до запознаване с възможностите на езика.

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

Палиндроми са думите „невен“ и „потоп“, както и изразите „ангел легна“ и „дебел лебед“.

В случаи на словосъчетания и изрази с по няколко думи е позволено интервалите да се пренебрегват, така че „аз обичам мач и боза“ също е палиндром.

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

При тестване ще използваме израза: „If I Had a Hi-Fi“.

Винаги търсете подходящи тестове за дадена функционалност. Ако бях използвал примерно само „SOS“ можеше да изпусна условието, че интервали е позволено да се игнорират. Още повече – в гореописания израз имаме дори и тире като специален знак.

Колкото повече частни случаи тестваме, толкова по-уверени можем да сме, че script-ът ни работи правилно.

Като за начало ще трябва да намерим начин да игнорираме всички знаци различни от букви.

За целта бихме могли да използваме str_replace.

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

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(' ', '', $test);

echo $simplified;

Това би извело „IfIHadaHi-Fi“.

Действието на функцията str_replace би трябвало да е познато от урока Първи стъпки в PHP – функции за текст

Проблемът обаче е тирето. Затова можем да извикаме втори път функцията:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace('-', '', str_replace(' ', '', $test));

echo $simplified;

Резултатът от първото извикване на функцията го подаваме към второто извикване на функцията. За повече четимост може да го напишем така:

$test = 'If I Had a Hi-Fi';

$no_spaces = str_replace(' ', '', $test);
$no_spaces_and_dashes = str_replace('-', '', $no_spaces);

echo $no_spaces_and_dashes;

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

Така можем да копираме функцията още няколко пъти за други специални знаци:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(' ', '', $test);
$simplified = str_replace('-', '', $simplified);
$simplified = str_replace(',', '', $simplified);
$simplified = str_replace('.', '', $simplified);

echo $simplified;

Този начин на изреждане на всички знаци не е много подходящ и води до много код.

Ако сте чели внимателно описанието на функцията str_replace може би ви е направило впечатление, че може за find и replace да се подаде не просто текст, а масиви, като елементи от първия ще се заменят със съответните елементи от втория.

Можем да пренапишем кода, който имаме до момента по следния начин (и да запазим абсолютно същата функционалност):

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(
    array(' ', '-', ',', '.'),
    array('',  '',  '',  ''),
    $test
);

echo $simplified;

Кодът е форматиран така, че лесно да може да се види кой знак с какъв ще бъде заместен. В случая всички се заместват с празен string – ''. Затова можем да запазим първия аргумент като масив, а втория да си остане просто '', защото винаги е едно и също:

$test = 'If I Had a Hi-Fi';

$simplified = str_replace(
    array(' ', '-', ',', '.'),
    '',
    $test
);

echo $simplified;

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

Вашият коментар

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

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax