Главная страница

Лекции. Основные понятия и определения


Скачать 1.94 Mb.
НазваниеОсновные понятия и определения
Дата27.03.2018
Размер1.94 Mb.
Формат файлаdocx
Имя файлаЛекции.docx
ТипКонтрольные вопросы
#39570
страница43 из 58
1   ...   39   40   41   42   43   44   45   46   ...   58

15.3. Работа со строками


Здесь будут рассмотрены средства манипулирования со строковыми данными как в языке C, так и в языке Basic. Эти средства группируются по функциональному признаку с тем, чтобы получить представление об общих чертах и отличиях в их реализации на каждом языке. Наряду с новыми средствами будут приведены и описанные ранее. Цель такого изложения материала заключается в том, чтобы свести в одном разделе практически все аспекты обработки символьных данных.

15.3.1. Литералы


Правило записи строковых литералов в языках C и Basic одинаково:

строковый литерал := "<текст>"

Пример.

"Это строковый литерал"

В языке Basic литерал типа string относится к виду строк переменной длины и занимает в памяти (10 + длина строки) байтов.

В языке C любой строковый литерал есть массив символов, заканчивающийся символом '\0', который добавляет транслятор, т.е. его длина в памяти на 1 символ (байт) больше числа символов между кавычками.

Пример.

"Это строка!" (11 знаков) → в памяти будет: Это строка!\0 (12 знаков)

15.3.2. Переменные


Basic

Тип данных string.

Объявление:

<имя> As String



C

Типа данных string нет.

Вместо строковых переменных используются массивы типа char. Объявление:

char <имя>[<длина>]




15.3.3. Операторы и функции


Basic

C





Ввод - вывод



Ввод строки в окно InputBox (поясняющий текст[, заголовок окна]

[,значение по умолчанию][,xнач] [, yнач]).

Возвращаемое значение: строка, введенная с клавиатуры в поле ввода.

Аргументы:

- если заголовок окна опущен, то в окно помещается имя приложения;

- значение по умолчанию – значение, появляющееся в поле ввода; если пользователь согласен с этим значением, то, не вводя значение с клавиатуры, нужно щелкнуть по кнопке ОК;

- xнач, yнач – координаты левого верхнего угла окна; если xнач опущено, то окно центрируется по горизонтали; если yнач опущено, то окно располагается примерно на уровне 1/3 от верха экрана.

Пример. InputBox("Число людей в кругу:")

Поясняющий текст: Число людей в кругу.

Заголовок окна: Flavii.

Файл прототипов stdio.h.inputbox

Ввод с клавиатуры:

- функция scanf (спецификация %s);

- функция gets(char*).

Введенное значение заносится в символьный массив. Обе функции добавляют конечный символ '\0'.

Можно заполнять символьный массив с клавиатуры в цикле с помощью функции getchar (char). В этом случае, конечный нуль не добавляется.

Пример. Поэлементное присваивание.

char str1[20], str2[20];

...................................

gets(str1);

for(i=0; str2[ i ]=str1[ i ]; i++);

Вывод на экран:

- функция printf (спецификация %s);

- функция puts(char*).

Также в цикле можно выводить строки с помощью функции putchar (char).



Вывод строки в окноMsgBox (сообщение[, кнопки][, заголовок]).

Возвращаемое значение: код нажатой кнопки. Используется для организации диалога. Изучить самостоятельно.

Пример. MsgBox("Остался жив №" & nomer)

Аргументы:


- кнопки – целое выражение, кодирующее число и названия выводимых в окно кнопок; если опущено, выводится одна кнопка ОК;

- заголовок – см.функцию InputBox.

Консольный ввод: ReadLine()msgbox

Консольный вывод: {Write | WriteLine} (<управляющая строка>[, <список-данных>])





Конкатенация (сцепление)



Оператор &

Файл прототипов для после-дующих функций string.h.

char* strcat(левая строка, правая строка

Результат – левая строка.


Копирование (присваивание)


Оператор =
char* strcpy(копия, оригинал)





Сравнение

Оператор =

Пример.

Dim str1 As string, str2 As String

str1="Привет " : str2="семье!"

str1 & str2 → "Привет семье!"

If str1 = str2 Then ' Результат→False

Есть 2 режима сравнения строк, которые задаются инструкцией вида:

Option Compare <режим> либо в меню среды:

Project (Проект)→Properties (Свойства) → Compile (Компиляция)→Option compare (Метод сравнения строк)

Режимы:

- Binary – с учетом регистра (по умолчанию);

- Text – без учета регистра.

int strcmp(строка 1, строка 2)

Возвращаемое значение равно:

< 0, если строка 1 < строки 2;

=0, если строка 1 == строке 2;

> 0, если строка 1 > строки 2.

Пример.

char str1[20], str[20];

strcpy(str1, "Привет ");

strcpy(str2, "семье!");

strcat(str1, str2); → "Привет семье!"

if(strcmp(str1, str2)) →str1 != str2


Длина строки



Len(строка)unsignedstrlen(char *);

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



Первое вхождение строки s2 в s1


InStr([начальная позиция,] где ищем, что ищем[, режим сравнения])

Возвращаемое значение: позиция, с которой строка что ищем входит в строку где ищем; если вхождения нет, возвращается 0.

Аргументы:

- начальная позиция – позиция, с которой начинается поиск; если опущена, то поиск с первой позиции;

- режим сравнения := {Binary | Text}; если опущен, то определяется инструкцией Option Compare; если задан, то начальная позиция обязательна.

Пример.

s1="0123456789" : s2="345"

k=InStr(5, s1, s2) ' k=0

char*strstr(s1,s2);

Возвращаемое значение: указатель на символ, с которого начинается вхождение s2 в s1;

если вхождения - нет, возвращается NULL.

Пример.

strcpy(s1, "0123456789");



strcpy(s2, "345");

p=strstr(s1, s2);



Строка из пробелов:

Space(число пробелов)

Строка из произвольных повторяющихся символов:

Strdup(число, строка)

Строка строится из первого символа строки.

char* strset(строка, символ)

Другие возможности




Выделение подстрок:

- Left(строка, n)n первых символов строки;

- Right(строка, n)n последних символов строки;

- Mid(строка, начало[, n])n символов строки с позиции начало.

- {Ltrim | Rtrim | Trim}(строка) – удалить пробелы: начальные | конечные | с двух концов строки.

Выравнивание:

- Lset(строка, n) – возвращает строку, заполненную символами строки.

Инициализация символьного массива.

char mes[ ]="Это строка!";

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

- Rset(строка, n) – делает то же самое, но пробелами заменяются "левые” символы.



Пример. Определить, являются ли 2 строки анаграммой.

Function anagr(str1 As String, _

str2 As String) As Boolean

Dim len1 As Integer, _

len2 As Integer, _

i As Integer, _

j As Integer, _

fl1 As Boolean=True, _

fl2 As Boolean, _

sled( ) As Boolean

len1=Len(str1) : len2=Len(str2)

If len1<>len2 Then Return False

Redim sled(len1-1)

For i=0 To len1-1

sled( i )=False

Next

i=0

Do While iAnd fl1

j=0 : fl2=True

Do While jAnd fl2

If Not sled( j ) And _

Mid(str1, i, 1)= _

Mid(str2, j, 1) Then

sled(j)=True

fl2=False

End If

j=j+1

Loop

If fl2 Then fl1=False

i=i+1

Loop

Return fl1

End Functionshort anagr(char *str1, char *str2){

short len1,

len2,

i, j;

bool fl1=true, // true – анаграмма

fl2,// f - символ в str2 найден

sled[20]; // true - j-й символ в

//str2 использован

len1=strlen(str1); len2=strlen(str2);

if(len1 != len2)returnfalse;

for(i=0; i

sled[ i ]= false;

for(i=0; i

fl2=true;

for(j=0; j

if(!sled[ j ] && str1[ i ]==

str2[ j ]){

sled[ j ]=true;

fl2=false;

}

}

if(fl2)fl1=false;

}

return fl1;

}



1   ...   39   40   41   42   43   44   45   46   ...   58


написать администратору сайта