Глава 12. Строки и методы работы с ними.

Глава 12
Строки и методы работы с ними

Многие языки программирования позводяют-вбрабатывать строковые данные. Прежде, чем рассмотреть принципы работы со строками в языке JavaScript, уточним некоторые понятая, относящиеся к строкам. Алфавит — это конечное множество символов. Строка — конечная последовательность символов некоторого алфавита, рели рассматриваем алфавит А, состоящий из двух символов (0, ]}, то строками в алфавите А являются: 1001, 1, 01, 10, 1111 и т. д. Пустая строка — это строка, не содержащая ни одного символа. В строке важен порядок символов, так, строки 01 и 10 различны. Длина строки равна числу символов в строке. Длина пустой строки равна нулю, длина строки 11 равна двум, длина строки 1001 — четырем. Если X и Y — строки, то их сцеплением или конкатенацией называется строка XY, полученная приписыванием символов строки Y за символами строки X. В предыдущих примерах неоднократно использовались строковые литералы, например, при выводе некоторой информации в документ Document.write ("Площадь равна", s). Напомним, что строковый литерал представляет собой последовательность символов, заключенную в одинарные или двойные кавычки. Строковые литералы или строковые переменные являются в языке JavaScript объектом типа string, к которому могут быть применены методы, определенные в языке. Создание нового объекта требует вызова функции-конструктора объекта. Для того чтобы создать строковый объект, надо применить конструктор newstring, например:

s=newString("результат=")

Объект string имеет единственное свойство length (длина_строки). Выражение s. length выдает значение 10, равное длине строки, содержащейся в строковом объекте s. Объект string имеет два типа методов. С методами, непосредственно влияющими на саму строку, мы сейчас и познакомимся, рассматривая примеры обработки текстовой информации.

Одним из часто используемых методов является метод выделения из строки отдельного символа. Метод charAt(ni) возвращает символ, позицию которого определяет параметр ni. Символы в строке перенумерованы, начиная с 0.

  Вывод символов строки в "столбик"

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

При решении задачи из заданной строки последовательно выбираются символы. Формируется новая строка, в которой за каждым символом ставится последовательность символов, обеспечивающая переход на новую строку. Когда строка результата сформирована, то она размещается в текстовом поле формы, тем самым для исходной строки осуществляется вывод в "столбик". Сценарий, осуществляющий обработку строки, приведен в листинге 12.1.

Листинг 12.1. Вывод символов строки в "столбик"

<HTML> 

<HEAD>

<TITLE>Вывод символов строки в "столбик"</TITLE> 

<script language="JavaScript"> 

<!-— //

function ttest(s) 

{ var sres="Прочитанный текст:"+" \r\n"+s+"\r\n"+

'Текст в "столбик":'+"\r\n" 

var cur="" 

for ( var i=0; i <= s.length-1; i += 1)

(c=s.charAt(i); cur +=c+"\r\n" } 

sres+=cur 

return sres 

}

//-—> 

</script> 

</HEAD> 

<BODY bgcolor="#FFFFCC">

<Н4>Символы текущей строки в столбик</Н4> 

<FORM name="form1">

Введите строку: <input type="text" size=20 name="st1"><hr> 

<input type="button" value=Bыпoлнить

onClick="forml.res.value=ttest(forml.stLvalue)"> 

<input type="reset" value=Очистить><hr> 

<textarea cols=20 rows=7 name= res></textarea>

</FORM> 

</BODY> 

</HTML>

На рис. 12.1 изображен документ, соответствующий приведенному коду.

Рис 12.1. Вывод текста в столбик

Строка является универсальным способом представления информации. Часто пользователь вводит информацию в виде строки, а программа должна уметь распознавать, какого рода данные были введены. В следующей задаче вводимая строка представляет собой последовательность оценок, и требуется эту строку проанализировать и извлечь из нее нужные данные.

  Сводка по результатам проведения экзамена

Напишем программу, которая по последовательности оценок, полученных на экзамене, формирует сводку. В сводке содержатся сведения о числе студентов, сдавших экзамен на "отлично", "хорошо", "удовлетворительно" и "неудовлетворительно". Кроме того, подсчитывается средний балл, на который сдан экзамен. Для вычисления среднего балла суммируются все оценки, полученные на экзамене, и рассчитанная сумма делится на число студентов.

В функцию syod поступает строка. С помощью цикла просматриваются символы строки, выбираются те, которые соответствуют оценке, остальные игнорируются. В функции используются четыре переменные t2, t3, t4, ts для хранения числа оценок. В теле цикла все оценки суммируются для того, чтобы затем получить средний бал по предмету. После анализа всей строки в соответствующих полях формы выводится требуемая информация так, как изображено на рис. 12.2.

Рис 12.2. Сводка по экзамену

HTML-код представленного на рисунке документа со сценарием, формирующим сводку по экзамену, представлен в листинге 12.2.

Листинг 12.2. Формирование сводки по экзамену

<HTML> 

<HEAD>

<TITLE>Работа со строками. Сводка по экзамену</TITLE> 

<script language="JavaScript"> 

<!-— //

function svod(obj)

{ var t2=0;  var t3 =0;  var t4 =0;  var t5=0 

var s =0;  var n =0;  var i;  var r 

var st=obj.data.value 

for ( 1=0; i< st.length; i++) 

{ r = st.charAt(i); 

if (r>="2" && r<="5") 

{ n=n+l

s=s+Number(r) 

switch (r)

{ case "2": {t2++; break}; 

case "3": {t3++; break}; 

case "4": {t4++; break}; 

case "5": {t5++; break}; 

}

obj.res2.value=t2;  obj.res3.value=t3 

obj.res4.value=t4;  obj.res5.value=t5 

obj.num.value=n;   obj.sr.value=s/n 

}

//-—> 

</script> 

</HEAD> 

<BODY bgcolor="#FFFFCC">

<H4 align=center>Формирование сводки по экзамену</Н4> 

<FORM name="form1"><CENTER>

Введите последовательно все оценки, полученные на экзамене 

<input type="text" name="data" size="30"> <br> 

После ввода всех оценок нажмите на кнопку

<input type="button" value="Сводка" onClick="svod(form1)"><hr> 

<TABLE border=3><caption>Сводка по экзамену</caption> 

<TR><TH bgcolor=silver>оценка</TH>

<TH bgcolor=silver>число сдавших на оценку</ТН></ТR> 

<ТR><ТD>отлично</TD>

<TD align=center><input type="text" name="res5"

size="5"></TD></TR> 

<TR><TD>xopomo</TD>

<TD align=center><input type="text" name="res4"

size="5"></TD></TR>

<TR><TD>yдoвлeтвopитeльнo</TD>

<TD align=center><input type="text"

name="res3" size="5"></TD></TR> 

<TR><TD>нeyдoвлeтвopитeльнo</TD>

<TD align=centerxinput type="text" name="res2"

size="5"></TD></TR> 

<TR><TH colspan=2 bgcolor=silver align=center>

Дополнительные сведения</TH></TR> 

<TR><TD>кoличecтвo сдававших</ТD>

<TD align=centerxinput type="text" name="num"

size="10"></TD></TR> 

<TR><TD>cpeдний балл</ТD>

<TD align=center><input type="text" name="sr" size="10"> 

</TD></TR> 

</TABLE>

<input type="reset" value="Отменить"> 

</FORM> 

</BODY> 

</HTML>

  Проверка идентификатора

Напишем программу, определяющую, является ли последовательность введенных символов идентификатором. Под идентификатором будем понимать последовательность букв латинского алфавита (как прописных, так и строчных) и цифр. Последовательность символов, являющихся идентификатором, должна начинаться с буквы.

При решении задачи проверим первый символ введенной строки. Если символ не является буквой, то задача решена: введенная последовательность символов не является идентификатором. Если же первый символ — буква, то анализ строки следует продолжить. Поочередно просматриваются все символы последовательности. Если какой-либо элемент не является буквой или цифрой, то анализ строки следует прекратить, а работу цикла прервать. Если просмотрели все символы строки, и каждый из них удовлетворяет нашему условию, то введенная строка представляет собой идентификатор.

HTML-код приведен в листинге 12.3.

Листинг 12.3. Проверка; является ли последовательность символов идентификатором

<HTML> 

<HEAD>

<TITLE>Последовательность символов - идентификатор</TITLE> 

<script language="JavaScript"> 

<!-- //

function idt(obj) 

{ var s=obj.data.value 

var res=l 

var ch=s.charAt(0)

if (!(ch>='a' && ch<='z' || ch>='A' && ch<='Z')) res=0; 

if (res!=0)

{ for (var i=l; i <= s.length-1; i++) 

{ ch=s.charAt(i)

if (!(ch>='a' && ch<='z' || ch>='A' && ch<='Z' ||

ch>='0' && ch<='9')) 

{res=0; break} 

}

if (res==l) obj.result.value="идентификатор" 

else obj.result.value="He является идентификатором" 

}

//--> 

</script> 

</HEAD> 

<BODY>

<Н4>Является ли последовательность символов идентификатором?</Н4> 

<FORM name="form1">

<input type="text" name="data" size="8">

<input type="button" value="0пpeдeлить" onClick="idt(forml)"> 

<input type="text" name="result" size="28"><hr> 

<input type="reset" value="Отменить"> 

</FORM>

</BODY>

</HTML>

  Вычисление количества повторений символа в строке

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

Исследуемый текст определяется в форме, с помощью тега <textarea>. Алгоритм решения прост. Просматривается строка слева направо, и каждый символ строки сравнивается с заданным символом. После просмотра всего текста будет определено число символов в тексте, совпадающих с данным. Полностью программа представлена в листинге 12.4.

Листинг 12.4. Количество заданных символов в тексте

<HTML> 

<HEAD>

<TITLE>Количество заданных символов в тексте</TITLE> 

<script language="JavaScript"> 

<!-— //

function numsym(obj) 

{ var h=obj.data.value 

var s=obj.textin.value 

var res=0

for (var i=0; i <= s.length-1; i++) 

{ ch=s.charAt(i) 

if (ch==h) 

{res+=l} 

}

obj.result.value=res 

)

//-—> 

</script> 

</HEAD> 

<BODY>

Количество заданных символов в тексте 

<FORM name="forml"> 

Введите текст:<br>

<textarea name="textin" rows=4 cols=20x/textarea><hr> 

Введите символ: <input type="text" name="data" size="8"><hr> 

<input type="button" value="0пределитъ"

onClick="numsym{forml)"><hr> 

Количество символов в тексте: 

<input, type="text" name="result" size=8><hr> 

<input type="reset" value="Отменить"> 

</FORM> 

</BODY> 

</HTML>

Одним из часто используемых является метод выделения из строки требуемой подстроки. Метод substring(n1,n2) возвращает подстроку, заданную индексами min(n1,n2) и max(n1,n2)-1. Если n1=n2, то результатом будет пустая строка. Если строка s="Решение", то значением s.substring(0,1) будет первый символ строки "Р". Результатом выполнения s.substring(0,7) будет вся строка.

  Вывод префиксов строки

Напишем программу, которая выводит все префиксы заданной строки.

Строка х называется префиксом строки s, если строка s пред ставима как XY. На рис. 12.3 показано, как может быть организован вывод префиксов введенной строки.

Рис 12.3. Определение префиксов строки

При решении задачи будем использовать метод substring, "наращивая" на каждом шаге итерации строку, являющуюся префиксом заданной (листинг 12.5).

Листинг 12.5. Вывод всех префиксов строки

<HTML> 

<HEAD>

<TITLE>Вывод всех префиксов строки</TITLE> 

<script language="JavaScript"> 

<!-- //

function pref(obj) 

{ var s=obj.data.value 

var res=""

for (var i=l; i <= s.length; i++) 

{ res +=s.substr(0,i)+"\r\n" }

obj.textpref.value = res 

}

//-—> 

</script> 

</HEAD> 

<BODY bgcolor="#FFFFCC">

<Н4>Вывод всех префиксов заданного слова</Н4> 

<FORM name="forml">

Введите слово: <input type="text" name="data" size="15"><hr> 

<input type="button" value="0пределить" onClick="pref(forml)"><hr> 

<textarea name="textpref" rows=10 cols=15></textarea><hr> 

<input type="reset" value="Отменить"> 

</FORM> 

</BODY> 

</HTML>

  Вывод суффиксов строки

Необходимо написать программу, которая выводит все суффиксы заданной строки. Строка Y называется суффиксом строки s, если строка s представима как XY.

При решении этой задачи следует сначала выделить последний символ строки, затем предпоследний и последний и т. д. Функция suf осуществляет формирование строки, которая затем будет помещена в соответствующее поле формы, в строке хранятся суффиксы введенного слова:

function suf(obj) 

{ var s=obj.data.value 

var n=s.length 

var res ="" 

for (var i=n-l; i >=0 ; i—-)

{ res +=s.substr (i-,n)+"\r\n" } 

obj.textsuf.value = res 

}

Метод substr (ni,n2) также позволяет выделять из строки подстроку. Параметр ni задает позицию первого символа подстроки; параметр п2 определяет количество символов в подстроке. Например, если строка з="сборник", то в результате выполнения substr (0,4) будет выделена подстрока "сбор".

  Вычисление количества повторений строки в тексте

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

Рис 12.4. Число заданных слов в тексте

В тексте слова разделяются пробелами. После того как очередное слово найдено, просмотр продолжается с символа, следующего за найденным словом. На рис. 12.4 показано, как может выглядеть документ.

HTML-код документа представлен в листинге 12.6.

Листинг 12.6. Количество заданных слов в тексте

<HTML> 

<HEAD>

<TITLE>Количество заданных слов в тексте</TITLE> 

<script language="JavaScript"> 

<!-- //

function nuraword(obj) 

{ var h=obj.data.value 

var s=obj.textin.value

s='  '+s+'  '

h='  '+h+'  ' 

var m=h.length 

var res=0 

var i=0

while (i <= s.length-1) 

{ ch=s.substr(i,m)

if (ch==h) {res+=l; i = i+m-1} 

else

i++ 

}

obj.result.value=res 

}

//-—> 

</script> 

</HEAD> 

<BODY bgcolor="#FFFFCC">

<Н4>Количество заданных слов в тексте</Н4> 

<FORM name="forml"> 

Введите текст:<br>

<textarea name="textin" rows=4 cols=20></textarea><hr> 

Введите слово: <input type="text" name="data" size="8"><hr> 

<input type="button" value="0пpeдeлить" 

onClick="numword(forml)"><hr>

Количество слов в тексте: <input type="text" name="result"

size=8><hr>

<input type="reset" value="Отменить"> 

</FORM> 

</BODY> 

</HTML>

  Зеркальная перестановка символов

Напишем функцию, которая формирует строку, являющуюся перевернутой по отношению к заданной. Если задана строка "топор", то по ней должна быть построена строка "ропот".

Просматривается исходная строка s слева направо, и одновременно формируется новая строка si, элементы в которую добавляются с начала. Функция rev переворачивает исходную строку.

function rev(s) 

{ var n=s.length-1 

var h 

var sl='' 

for (var i=0; i <=n; i++)

{ s1+=s.charAt(n-i) } 

return s1 

}

  Палиндром

Напишем функцию, определяющую, является ли заданное предложение палиндромом.

Палиндромом считается строка, которая читается одинаково как слева на право, так и справа налево. Палиндромами являются слова: казак, кок, шалаш и др. Палиндромами могут быть фразы, обычно считается, что пробелы между словами, знаки препинания и различия между маленькими и большими буквами игнорируются. Например, палиндромами являются фразы:

  • а роза упала на лапу Азора
  • кит на море не романтик

На рис. 12.5 изображен результат выполнения сценария анализа текста. Будем анализировать текст с обоих концов, пропускать пробелы. Если оба анализируемых символа не являются пробелами, то сравним эти символы. Если они различны, то анализ текста можно завершить, фраза не является палиндромом. Если же очередные символы одинаковы, то анализ следует продолжить. Заметим, что значение pi в программе может только увеличиваться, значение р2 лишь уменьшаться. Процесс проверки следует прекратить в случае, когда значение pi станет больше или равно значению р2. Это означает, что просмотрена вся строка, и символы на соответствующих местах одинаковы.

Рис 12.5. Строки-палиндромы HTML-код приведен в листинге 12.7.

Листинг 12.7. Строка-палиндром

<HTML> 

<НЕАЕ>

<TITLE>Проверка, являетря ли строка палиндромом</TITLE> 

<script language="JavaScript"> 

<!—- //

function pal(obj) 

{ var s=obj.data.value 

var n=s.length-l 

var pl=0 

var p2=n

var cl=s."charAt(0) 

var c2=s.charAt(n) 

var p=true 

var sl=""

while ((pl<p2)&&(p==true)} 

{ if (cl=" ") {pl+=l; cl= s.charAt (p1) }

else

if (c2=" ") {p2 -=1; c2= s.charAt(p2)} 

else

if (cl==c2)

(pl+=l; cl=s.charAt(pi); p2-=l; c2=s.charAt(p2)} 

else {p = false) 

if (!p) s1="не является палиндромом" 

else s1="является палиндромом" 

obj.res.value=sl 

}

//--> 

</script> 

</HEAD> 

<BODY>

<Н4>Является ли строка палиндромом?</Н4> 

<FORM name="forml"> 

<pre>

Введите строку: <input type="text" name="data" size="50"><hr> 

Результат: <input type="text" name="res" size="30"><hr> 

<input type="button" value="0пpeдeлить" ondick="pal(forml)"><hr> 

<input type="reset" value="Отменить"> 

</pre>

</FORM> 

</BODY> 

</HTML>

  Упражнения

1. Напишите программу, которая в последовательности чисел находит число правильных троек. Тройка чисел А, В, С называется правильной, если верно В - А = С - В.

2. Напишите программу, которая определяет, является ли последовательность символов идентификатором в заданном языке программирования.

3. В строке хранятся фамилия, имя и отчество, разделенные пробелами. Напишите программу, которая выводит:

• фамилию;

• инициалы;

• имя.

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

5. Слова в заданном тексте разделяются пробелами. Напишите программу, которая определяет:

• количество слов в тексте;

• и-е слово в тексте (если значение п больше, чем слов в тексте, то программа должна выдать соответствующее сообщение);

• последнее слово в тексте;

• самое короткое слово в тексте.

6. Напишите программу, в которой все слова А заменены словом В, где А и В — заданные слова, возможно, различной длины.

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

8. Напишите программу, которая все подряд идущие одинаковые символы заменяет на один.

9. Напишите программу, которая в заданном тексте находит все те слова, которые состоят только из заданных букв.

10. Напишите программу, которая определяет в заданном тексте все слова-палиндромы.

11. Напишите программу, которая определяет, состоят ли два заданных текста из одних и тех же слов.

12. Напишите программу, которая анализирует три текста:

• определяет все слова, которые встречаются в каждом из текстов;

• все слова, которые встречаются лишь в одном из текстов;

• все слова, которые встречаются, по крайней мере, в двух текстах.

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



Опубликовал admin
13 Авг, Пятница 2004г.



Программирование для чайников.