Лекции. Основные понятия и определения
Скачать 1.94 Mb.
|
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. Ввод с клавиатуры: - функция 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() Консольный вывод: {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 i j=0 : fl2=True Do While j 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; } |