Низ: Разлика между версии

Изтрито е съдържание Добавено е съдържание
м стринг > низ редактирано с AWB
м форматиране: 41x тире, 16x нов ред, 11 интервала, 6lokavica, тире-числа (ползвайки Advisor)
Ред 1:
В компютърните науки '''низ''' е крайна поредица от символи (представляващи краен брой '''знаци'''). Елементите му евентуално могат да бъдат променяни, както и дължината му. Низовете обикновено се разглеждат като тип данни и често са имплементирани като масиви от байтове (или думи), които съхраняват последователност от елементи, използвайки [[Символно_кодиране|кодиране на символите]].
 
В зависимост от [[Език_за_програмиране|езика за програмиране]] и използваният тип данни, [[Променлива_(програмиране)|променлива]] декларирана като низ може да бъде съхранена в паметта статично (предварително определена максимална дължина) или динамично (може да съдържа различен брой елементи).
 
Във [[Формални_езици|формалните езици]], които се използват в математическата логика и теоретичната информатика, низ е крайна последователност от символи от дадено множество, наречено азбука.
 
== Дължина на низ ==
Въпреки че низовете могат да имат произволна (но ограничена) дължина, в повечето езици за програмиране дължината е ограничена до изкуствен максимум. По принцип има два вида низови: с фиксирана дължина - – имат постоянна максимална дължина и използват същото количество памет независимо дали този максимум е достигнат; низове с променлива дължина.
 
== Формална теория ==
Line 19 ⟶ 20:
 
== Символни низове в C# ==
В [[Си_Шарп|C#]] символните низове са дефинирани в класа <code>System.String</code>. За декларация по време на писане на код се използва служебната дума <code>String</code>. Тъй като <code>String</code> е клас, той е референтен тип данни и в стека на програмата се съхранява само указателя, сочещ към поле от динамичната памет, където се съхранява реалната стойност на обекта..<ref name="Въведение в C#">[http://downloads.academy.telerik.com/svn/csharppart1/Materials/Intro-CSharp-Book-1.00.pdf Въведение в C#], 465- – 509.</ref>
 
=== Създаване на <code>String</code> ===
Line 42 ⟶ 43:
Трябва да се отбележи, че символните низове са неизменими и всяка промяна на един низ води до създаване на нов, в който се пази резултата и пренасочване към него. Това може силно да забави изпълнението на една програма при много редакции на един низ (например долепване на символи в [[Цикъл_(програмиране)|цикъл]]). В такива случаи използваме класа <code>StringBuilder</code>, който оптимизира работата с низове.<br><br>
'''Сравняване на низове'''
:'''Сравняване за еднаквост.''' Удобен за това е метода <code>Equals()</code>, който работи еквивалентно на <code>==</code>. Метода връща булев резултат <code>true</code> при еднакви низове и <code>false</code> при различни. Трябва да се има в предвид, че по този начин се сравняват побуквено елементите на масива, като се прави разлика между главни и малки букви. Често ще ни интересува само текстовото съдържание без регистъра на буквите, затова може да използваме метода <code>Equals()</code> с параметър <code>StringComparison.CurrentCultureIgnoreCase</code>
<big><source lang="csharp">
string word1 = "C#";
Line 158 ⟶ 159:
=== String Builder ===
Конкатенирането на низове е много бавна операция. Това е заради факта, че всеки път трябва да се заделя нов буфер и да се презипише цялата информация в низа наново, освен това стария буфер е неизползваем и той трябва да бъде изтрит от <code>Garbage collector</code>.
 
Затова се използва специално направен клас <code>StringBuilder</code>, този клас има предварително зададен буфер, който може да бъде динамично променян, благодарение на което работата със символни низове е много по-бърза. Когато сме завършили низа можем да извикаме метода <code>ToString()</code>, който да го преобразува в нормален низ.
 
Line 177 ⟶ 179:
 
== Символни низове в Java ==
 
В езика за програмиране [[Java]], символните низове са [[Обект_(програмиране)|обекти]].
 
В Java [[Клас_(програмиране)|класът]] <code>String</code> се използва за създаване и обработка на символни низове. Последователностите от символи, записани в [[Променлива_(програмиране)|променлива]] от класа, са [[Неизменим_обект|неизменими]] (immutable). Веднъж записано съдържанието на едно място, то не може да бъде променяно директно.
 
Line 186 ⟶ 188:
 
В този случай, <code>"Hello, world!"</code> е низов [[литерал]] – поредица от символи в кода, които са заградени с двойни кавички.
 
За отпечатване на съобщение в кавички е необходимо да се използва [[Екранираща_последователност|екраниращ]] символ (escaping character) – обратна наклонена черта (\).
<source lang="java">String quotedString = "She said \"Hello, World!\""; //She said "Hello, world!" </source>
Може да се създаде <code>String</code> обект като се използва ключовата дума <code>new</code> и [[Конструктор_(обектно-ореинтирано_програмиране)|конструктор]]. Класът <code>String</code> съдържа конструктори, които позволяват да се инициализира стойността на низа, чрез използване на различни източници, като [[Масив_(програмиране)|масив]] от символи:
<source lang="java">
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' };
Line 218 ⟶ 221:
System.out.println(fullGreeting); //Hello, world!
</source>
Възможно е долепване на различни типове обекти. За всеки обект, който не е от тип <code>String</code>, съществува метод за преобразуването му - – <code>toString()</code>.
 
=== Използване на <code>String.format()</code> ===
Line 225 ⟶ 228:
String example = String.format("%.2f", 3.141593); // "3.14"
</source>
 
=== Извличане на част от низ ===
Извличането на част от низ в отделна променлива се прави чрез метода <code>substring()</code>, като зададем начална и крайна позиция в текста.
<code>String substring(int beginIndex, int endIndex)</code> - – Резултата е нов низ, като <code>beginIndex</code> показва от къде да започва новият низ, а краят е <code>endIndex – 1</code>.
 
В случай че, не е упоменат <code>endIndex</code>, за край се счита последния символ от оригиналния символен низ.
<source lang="java">
Line 235 ⟶ 240:
</source>
 
=== Разцепване на низ по разделител ===
Методът <code>split</code> в класа <code>String</code> връща масив от символни низове състоящи се от поднизове разцепени от един или група от разделители.
<source lang="java">
Line 264 ⟶ 269:
 
=== Класовете <code>StringBuilder/StringBuffer</code> ===
 
Класовете <code>StringBuilder/StringBuffer</code> са алтернатива на класът <code>String</code>. Те могат да бъдат използвани навсякъде където се използват символни низове. Тези класове са по-приспособими от класът <code>String</code>. При тях може да се добавя ново съдържание.
 
По-важни методи в <code>StringBuilder</code>:
 
Line 274 ⟶ 279:
// 27
</source>
* <code>length()</code> - – връща дължината на записания низ в променлива
<source lang="java">
StringBuffer stringBuffer = new StringBuffer(“Hello World!”);
Line 280 ⟶ 285:
// 11
</source>
* <code>charAt(int index)</code> - – връща символа на указаната позиция
<source lang="java">
String example = "Welcome to Java";
Line 287 ⟶ 292:
//J
</source>
* <code>append(…)</code> - – слепва низ, число или друга стойност след последния записан символ в буфера
<source lang="java">
StringBuffer example = new StringBuffer("Welcome");
Line 321 ⟶ 326:
//aidepikiw
</source>
* <code>toString()</code> - – връща записаната информация в обекта на <code>StringBuilder</code> като резултат от тип <code>String</code>, който може да се запише в променлива на <code>String</code>
<source lang="java">
Integer example = 5;
Line 331 ⟶ 336:
 
=== Сравняване на символни низове ===
* <code>boolean endsWith(String suffix)/ boolean startsWith(String prefix)</code> - – връща стойност true ако низа завършва или започва с подниз деклариран като стойност на метода.
<source lang="java">
String example = new String("Welcome to Wikipedia!");
Line 354 ⟶ 359:
// true
</source>
* <code>int compareTo(String anotherString)</code> - – сравнява два низа лексикографски. За да бъдат два низа еднакви, то те трябва да имат еднакъв брой символи и да бъдат подредени в един и същ ред. Този метод връща цяло положително, отрицателно число или 0 в зависимост от лексикографската наредба.
<source lang="java">
String example = "Hello, World";
Line 371 ⟶ 376:
//0
</source>
* <code>boolean equals(Object anObject)</code> -  – връща резултат <code>true</code> ако стойностите на двата низа са еднакви и <code>false</code> ако са различни
<source lang="java">
boolean boolObject1 = new Boolean(true);
Line 382 ⟶ 387:
// boolObject1: true and boolObject2: false are equal: false
</source>
* <code>boolean equalsIgnoreCase(String anotherString)</code> - – сравнява двата низа дали са еднакви, без да взима предвид дали буквите са малки или големи.
<source lang="java">
String example1 = new String("Welcome to Wikipedia!");
Line 400 ⟶ 405:
== Низове в C ==
Низът в езика [[C_(език_за_програмиране)|С]] представлява последователност от символи, които завършват с терминираща нула ('\0'). Използва се [[ASCII]] таблица за символи.
 
Няма запазена дума <code>string</code>, затова трябва да използваме ето тези конструкции:
<source lang="c">
Line 405 ⟶ 411:
</source>
В този пример се вижда какво представлява низа отвътре. Забележете, че трябва да се остави място за [[Терминираща_нула|терминиращата нула]], защото благодарение на нея се разбира кога сме достигнали края на низа.
 
Тази конструкция може да се запише и съкратено по този начин:
<source lang="c">
Line 450 ⟶ 457:
free(str1); // Освобождаване на първия низ.
 
// Можем освен това да пренасочваме и [[Указател_(програмиране)|указателите]] ако искаме стойностастойността да е в str1. С "str1 = str2;",
// но тогава ще е добре и да освободим и памета от str2 с ключовата дума free.
</source>
 
== Низове в C++ ==
В [[C%2B%2B|С++]] съществува клас, намиращ се в <code>namespace std</code>, който поддържа работа с низове. Думата <code>string</code> е ключова дума. Запазването на низове в памета е по начина по който се запазват и в C(накрая има терминираща нула).
 
Работата със низове е много по-удобна, защото са предефинирани аритметичните знаци <code>+</code> и <code>=</code>.
<source lang="cpp">
Line 486 ⟶ 495:
== Низове в PHP ==
В [[PHP]] символът един байт, т.е., съществуват точно 256 възможни символа. Това също означава, че PHP няма естествена поддръжка за Unicode.
 
Знаците в даден низ могат да бъдат достъпвани и изменяни чрез указване на отместване от нулата за желания знак след низа посредством квадратни скоби, например $str[42], така че бихте могли да мислите за даден низ като за [[Масив_(програмиране)|масив]] от знаци.
 
ДeфиниранеДефиниране и инициализиране
<source lang="php">
$txt="Hello world!";
Line 502 ⟶ 512:
</source>
 
<code>strlen()</code> - – връща дължината на низа
<source lang="php">
echo strlen("Hello world!");
</source>
 
<code>strpos()</code> - – за търсене на символ/и в низ
<source lang="php">
echo strpos("Hello world!","world");
Line 515 ⟶ 525:
 
== Низове в JavaScript ==
 
Низът в [[JavaScript]] са последователност от знаци/символи, които започват и завършват с единични или двойни кавички. Освен да се работи с низовете като букви/знаци, JavaScript предлага възможността да се работи с тях и като [[Обект_(програмиране)|обекти]] с много свойства и функции. Това е полезно, когато трябва да се приложат определени процеси върху низът.
 
Line 533 ⟶ 542:
'''Методи'''
 
* <code>anchor()</code> - – Създава HTML [[таг]] за котва с цел на страницата
* <code>big()</code> - – Добавя таговете <nowiki><BIG></nowiki> и <nowiki></BIG></nowiki> около стойността на низа
* <code>bold()</code> - – Добавя таговете <nowiki><b></nowiki> и <nowiki></b></nowiki> около низова стойност
* <code>charAt()</code>- – Връща символа, който се намира на дадената позиция в низа
 
<source lang="javascript">var myString = 'Some text';
Line 542 ⟶ 551:
// Tози пример ще върне елементът на позиция 4: e </source>
 
* <code>charCodeAt()</code> - – Намира смволния код на символ от дадена позиция в низа
 
* <code>charCodeAt()</code> - Намира смволния код на символ от дадена позиция в низа
 
<source lang="javascript">
Line 550 ⟶ 558:
</source>
 
* <code>concat()</code> - – Слепва/[[Конкатенация|конкатенира]]/ два или повече низа и връща новата комбинирана низова стойност
 
<source lang="javascript">
Line 560 ⟶ 568:
</source>
 
* <code>fixed()</code> - – Добавя таговете <nowiki><TT></nowiki> и <nowiki></TT></nowiki> около низова стойност
* <code>fontcolor()</code> - – Добавя таговете <nowiki><FONT color="color"></nowiki> и <nowiki></FONT></nowiki> около низова стойност. Те сменят цвета на низа с указания цвят
* <code>fontsize()</code> -  – Добавя таговете <nowiki><FONT size="number"></nowiki> и <nowiki></FONT></nowiki> около низова стойност. Те променят размера на шрифта на низа с указано число
* <code>fromCharCode()</code> - – Използва символни кодове, предадени като параметри за създаване на нов низ
<source lang="javascript">
//fromCharCode(c1, c2,...)
Line 571 ⟶ 579:
//output: HELLO
</source>
* <code>indexOf()</code> -  – Търси символ, предаден като параметър, в низа. Ако бъде намерен, връща позицията на първото срещане на символа, иначе връща -1
<source lang="javascript">
//indexOf(char/substring)
Line 578 ⟶ 586:
alert("Pesho is in there!")
</source>
* <code>italics()</code> - – Добавя таговете <nowiki><I></nowiki> и <nowiki></I></nowiki> около низова стойност
* <code>lastindexOf()</code> -  – Търси символ, предаден като параметър в низа. Ако бъде намерен, връща позицията на последното срещане на символа, иначе връща -1
<source lang="javascript">
//lastIndexOf(substr, [start])
Line 586 ⟶ 594:
//output: 11
</source>
* <code>link()</code> -  – Създава HTML връзки чрез използване на низа като текст на връзката и свързване с URL адреса, предаден като параметър
* <code>match()</code> - – Сравнява низ и регулярен израз, за да провери дали съвпадат
<source lang="javascript">
//match(regexp) //select integers only
Line 602 ⟶ 610:
//output: null
</source>
* <code>replace()</code> - – Открива дали един регулярен израз съвпада с низ и след това замества съвпадналия низ с нов низ
<source lang="javascript">
//replace(substr, replacetext)
Line 609 ⟶ 617:
//output: Ivan is 22 years old
</source>
* <code>search()</code> - – Изпълнява търсене на съвпадение между регулярен израз и указан низ
* <code>slice()</code> - – Изпълнява търсене на съвпадение между регулярен израз и указан низ
<source lang="javascript">
/slice(start, end)
Line 617 ⟶ 625:
text.slice(5,8) //returns "dar"
</source>
* <code>small()</code> - – Добавя таговете <nowiki><SMALL></nowiki> и <nowiki></SMALL></nowiki> около низовата стойност
* <code>split()</code> - – Разделя низа на масив от низове на базата на някакъв символ, предаден като параметър на метода
<source lang="javascript">
//split(delimiter)
Line 626 ⟶ 634:
var word=message.split("l")
</source>
* <code>strike()</code> - – Добавя таговете <nowiki><STRIKE></nowiki> и <nowiki></STRIKE></nowiki> около низова стойност
* <code>sub()</code> - – Добавя таговете <nowiki><SUB></nowiki> и <nowiki></SUB></nowiki> около низова стойност
* <code>substr()</code> - – Позволява да се върне част от низа, указана като начална позиция и завършваща след определен брой символи
* <code>substring()</code> - – Позволява да се върне част от низа, указана като начална позиция и крайна позиция
<source lang="javascript">
//substring(from, [to])
Line 637 ⟶ 645:
//output: Wikipedia
</source>
* <code>sup()</code> - – Добавя таговете <nowiki><SUP></nowiki> и <nowiki></SUP></nowiki> около низова стойност
* <code>toString()</code> - – Връща низовата стойност на String обекта
* <code>toLowerCase()</code> - – Конвертира целият низ в малки букви и връща резултата
<source lang="javascript">
//toLowerCase()
Line 647 ⟶ 655:
//output: hello wikipedia
</source>
* <code>toUpperCase()</code> - – Конвертира целият низ в големи букви и връща резултата
<source lang="javascript">
//toUpperCase()