10 / 10 / 3 Регистрация: 19.03.2010 Сообщений: 679 Записей в блоге: 2 |
|
1 |
|
Как проверить что вводим только буквы?23.10.2010, 22:26. Показов 9082. Ответов 9
НА вход поступает строка, как проверить что мы ввели только буквы, не цифры или другие левые символы?Оо помогите плз!! оч. прошу
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
23.10.2010, 22:26 |
9 |
Jaguar 393 / 279 / 38 Регистрация: 06.08.2010 Сообщений: 833 |
||||
23.10.2010, 22:37 |
2 |
|||
0 |
2857 / 1986 / 788 Регистрация: 23.09.2010 Сообщений: 4,877 |
|
23.10.2010, 22:41 |
3 |
Eguar ё введи и посмотри что выдаст
0 |
393 / 279 / 38 Регистрация: 06.08.2010 Сообщений: 833 |
|
23.10.2010, 22:50 |
4 |
ввел,все нормально
0 |
pryda Неадекват и грубиян 310 / 297 / 301 Регистрация: 22.02.2010 Сообщений: 645 |
||||
23.10.2010, 23:27 |
5 |
|||
0 |
393 / 279 / 38 Регистрация: 06.08.2010 Сообщений: 833 |
|
23.10.2010, 23:48 |
6 |
pryda читайте внимательней
0 |
10 / 10 / 3 Регистрация: 19.03.2010 Сообщений: 679 Записей в блоге: 2 |
|
24.10.2010, 10:09 [ТС] |
7 |
Спасибо, но надо например ввожу «Петров», и чтобы была проверка что мы не ввели левых символов!
0 |
Puporev Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
24.10.2010, 10:28 |
8 |
|||
0 |
WatsOne 36 / 37 / 13 Регистрация: 10.10.2010 Сообщений: 115 |
||||
24.10.2010, 10:29 |
9 |
|||
0 |
Puporev Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||||||
24.10.2010, 10:35 |
10 |
|||||||
Или проверять при вводе
Добавлено через 2 минуты
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
24.10.2010, 10:35 |
Помогаю со студенческими работами здесь Проверить, что в массиве есть только одно максимальное значение Строки. Проверить, что текст начинается с некоторой ненулевой цифры, за которой следуют только буквы Файл f содержит буквы латинского и русского алфавитов. Занести в файл h только латинские буквы, а в файл g — только русские буквы Файл f содержит буквы латинского и русского алфавитов. Занести в файл h… Текст задан последовательностью литер; проверить, что в нем присутствуют только латинские буквы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 10 |
На занятии будет рассмотрен Строковый тип данных в Паскаль и примеры работы с ним
Содержание:
- Символьный тип char в Паскале
- Основные функции для работы с символами
- Строковые переменные в Паскаль
- Функции работы со строками в Pascal
- Стандартные методы и запросы (pascalAbc.net)
- Посимвольный ввод до пробела
Символьный тип char в Паскале
Символьной переменной соответствует тип char:
Инициализация символьной переменной:
Основные функции для работы с символами
Функция преобразует целое число, имеющее тип BYTE, в один символ ASCII-кода:
Пример: распечатать двойную кавычку по ее коду в ASCII-таблице
1 2 3 4 5 6 7 |
var a:char; i:byte; begin i:=34; {код, соответствующей символу " в ASCII-таблице} a:=chr(i); writeln(a) end. |
Функция возвращает порядковый номер символа параметра в таблице ASCII:
Пример: Распечатайте часть таблицы ASCII, конкретнее — символы, соответствующие кодам 32-255
1 2 3 4 5 |
var i: integer; begin for i:=32 to 255 do write(chr(i):3); end. |
Примеры:
var c := 'Ю'; var n := Ord(c); // n := c.Code Print(n); // 1070 c := Chr(n); print(c); // Ю
Символьные константы: #код
– символ с определенным кодом:
#10 – новая строка (Linux) #13#10 – новая строка (Windows) #9 – tab Print('a'#10'b');
Методы класса типа char
char.IsLetter(с); // буква ли, boolean char.IsDigit(с); // десятичное ли число, boolean char.IsLower(с); // буква нижнего регистра, boolean char.IsUpper(с); // буква верхнего регистра, boolean char.IsPunctuation(с); // знак препинания, boolean с := char.ToLower(с) ; с := char.ToUpper(с);
Операции для типа char
c1 < c2;// сравнение по коду c1 > c2; с in ['a','e','i','o','u',’y’]; // c принадлежит гласным с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам
Задание:
Запросите ввести два символа. Определите, принадлежат ли символы английским буквам, и если да, то гласные ли это буквы. Преобразуйте в верхний регистр ту букву, код которой меньше.
Пример вывода:
Введите два символа: u z u - английская буква, гласная z - английская буква, не гласная Буква u в верхнем регистре U
Некоторые выражения:
//c принадлежит диапазону: c.InRange('a'..'z'); //Трансформация символа в цифру: var n := Ord(c) – Ord('0'); // Увеличение кода символа на n: c := Chr(Ord(c) + n); // или Inc(c,2);
Строковые переменные в Паскаль
Строковые переменные в Паскале имеют тип String
Объявление и инициализация строковой переменной:
1 2 3 4 5 var a:string; begin a:='Привет всем!'; writeln(a); end.Ввод значения строковой переменной с клавиатуры:
1 2 3 4 5 6 var a:string; begin writeln('Введите слово'); readln(a); writeln('Вы ввели слово ',a); end.Строка «рассматривается» компилятором, как массив букв:
для компилятора:
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а'
Важно: Значения строковых переменных всегда заключаются в одинарные кавычки
Функции работы со строками в Pascal
Исходные данные | Операция | Результат |
---|---|---|
s1:='Мото'; s2:='роллер' |
s3:=s1+s2; |
s3=’Мотороллер’ |
s5:='Мотороллер'; |
k:=Pos('рол',s5); |
k=5 |
s3:='Мотороллер'; |
l:=Length(s3); |
l=10 |
s3:='астроном'; |
s4:=Copy(s3,3,4); |
s4= ‘трон’ |
s5:='Коробочка'; |
Delete(s5,4,2); |
s5=’Корочка’ |
s6:='Рука'; s7:='баш'; |
Insert(s7,s6,3); |
s6=’Рубашка’ |
x:=2.73284; |
Str(x:4:2,s8); |
s8=’2.73′ |
s8='2.73'; |
Val(s8,x,Osh); |
x=2.73 |
Пример: Подсчитать кол-во букв «f» в тексте.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Операции со строками:
s1 + s2 // конкатенация s1 и s2 s1 += s2 s1 < s2 // лексикографическое сравнение 'abcd' < 'aad' s * n // конкатенация n копий строки s s[a:b] // срез (индексация с 1) s[a:b:step] // срез с шагом s?[3:5] ; // безопасный срез (не вызывает ошибок) s?[a:b:step] // безопасный срез с шагом s1 in s
String 1. Дан текст. Удалить в нём все слова кот. Выполнить задание двумя способами: используя стандартные функции работы со строками, и, работая со строкой как с массивом символов.
Пример выполнения:
введите строку мой кот - хороший кот Результат: мой - хороший
* Задание повышенной сложности: запросить у пользователя ввести подстроку, которую требуется удалить из исходной строки.
String 2. Составить программу проверки, есть ли в тексте буква s. Выдавать true (если найдено) или false (если не найдено).
Примеры использования логического типа (true и false) смотрите здесь.
Пример выполнения:
Введите строку: Hello world Результат: false
Введите строку: Hello students Результат: true
String 3. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку — заменяя каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Требуется составить и программу дешифровки.
Использовать функции для работы с символами: chr и ord pascal.
String 4. Дано предложение, определить количество слов в нём.
Подсказка: считать количество слов по количеству пробелов в строке.
* усложненный вариант: предусмотреть, что в начале или в конце введенной строки введен пробел
Пример: Найти количество цифр в строке.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример: Определить является ли данное слово перевертышем (палиндромом).
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
String 5. Составить программу подсчета количества встречаемых в тексте сочетаний букв «ма».
String 6. Определить, встречается ли в тексте сочетание букв «ку».
Пример выполнения:
Введите строку: Кума Результат: да
Введите строку: Дед Результат: нет
String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).
Пример выполнения:
Введите строку: Барабулька Введите букву, которую заменить: а Введите букву, на которую заменить: у Результат: Бурубульку
String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».
String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:
Пример выполнения:
Введите строку: 1234567891011слово следующееСлово иСледСлово Слово с максимальным количеством букв: следующееСлово
Алгоритм:
for
.const letters=['a'..'z'];
), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string
).String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:
Алгоритм:
arrayS: array[1..100] of string;
строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].String 11. Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы».
Пример: Введите имя, фамилию и отчество: Иван Алибабаевич Попов Результат: Попов И.А.
Примечание:
Использовать функции: Pos, Copy, Delete
String 12. Программа должна позволять ввести текст, и потом удалять в нем все восклицательные знаки, расположенные непосредственно перед запятой, и выводить измененный текст на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определенных действий!, предписание исполнителю! совершить последовательность действий!, набор команд для компьютера! Выходной текст: Алгоритм — это правила выполнения определенных действий, предписание исполнителю! совершить последовательность действий, набор команд для компьютера!
Трудность низкая:
Программа должна формировать в памяти вторую строковую переменную с измененным текстом, а потом выводить ее на экран.
Трудность высокая:
Программа должна преобразовывать исходную строку без использования дополнительных переменных, и затем выводить ее на экран.
А теперь рассмотрим олимпиадное задание по Паскалю:
Задача Цезарь: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
* Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k
, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var a:char; i,n:byte; s,s1:string; begin s1:=''; readln(s); for i:=1 to length(s) do begin n:=ord(...); n:=n+3; if n=123 then n:=97; {в ASCII 120 - x, 97 - a} if ...; {в ASCII 121 - y, 98 - b} if ...; {в ASCII 122 - z, 99 - c} a:=chr(...); s1:=...; end; writeln(s1) end. |
Стандартные методы и запросы (pascalAbc.net)
CountOf
— количество вхождений'мама мыла раму'.CountOf('м').Print; // 4
Contains
— содержит ли (логическая)'мама мыла раму'.Contains('б').Print; // False
IndexOf
— индекс искомого вхождения'hello world'.IndexOf('w').Print; // 6
Remove
— удаление вхождения'hello world'.Remove(' ').Print; // helloworld
Replace
— замена вхождений символа на другой символ'hello world'.Replace('l','L').Print; // heLLo worLd
и другие…
Запросы LINQ со строками
* LINQ (Language Integrated Query) — язык интегрированных запросов
Where
— Фильтрация массива (последовательности) с условиемvar sArr:=Arr('aab','bcd','efg'); sArr.Where(w->w.Contains('b')).Print; // aab bcd sArr.Where(w->w.CountOf('a')=2).Print; // aab
Задания: Предыдущие задания выполнить с использованием стандартных методов и запросов фильтрации.
Посимвольный ввод до пробела
Посимвольный ввод удобен для «мгновенной» обработки символов в строке.
Пример: посимвольно считывать фамилию
Решение:
var name: array[1..n] of string; c:char; ...
Для организации массива символьных строк:
Пример: посимвольно считывать фамилии и заносить их в массив фамилий
Решение:
String 13. Программа должна позволять ввести предложение до точки (.
). Необходимо в введенном тексте вместо всех букв «ё» ставить буквы «е». Выполнить, работая со строкой посимвольно: программа должна формировать в памяти вторую строковую переменную с измененным предложением, а потом выводить ее на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определённых действий. Выходной текст: Алгоритм — это правила выполнения определенных действий.
String 14. с клавиатуры вводится число N, обозначающее количество студентов в группе, а затем – N строк, в каждой из которых – информация о студенте в формате:
<Фамилия> <год рождения> <оценка>
- Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
- Вывести фамилии студентов, у которых оценка 2.
- Вывести фамилии студентов, родившихся в 1996 году.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
Формулировка задачи:
Задача:
Напишите функцию для поиска буквы в заданной строке.Функция возвращает True, если в строке есть хоть одна эта буква , и False в противном случаи.
function find(arg: string; ch: char): boolean; var i, n: integer; begin n := 0; for i := 1 to length(arg) do if arg[i] = ch then n := n + 1; if n > 0 then find := true else find := false; end; var s: string; ch1: char; begin writeln('Введите строку'); readln(s); writeln('Введите буквy,наличие которой нужно проверить'); readln(ch1); writeln(find(s, ch1)); end.
Написал программу, но учитель по информатике сказал, что программа очень сложна и не надежна.
Вопрос: Как сделать программу проще и надежнее???
Код к задаче: «Функция для поиска буквы в строке»
textual
function find(arg: string; ch: char): boolean; begin find:=pos(ch,arg)>0; end;
Полезно ли:
12 голосов , оценка 3.917 из 5
22.02.2021
2699
Программируем на Паскале
Ваш комментарий
Сегодня мы познакомимся со строковым типом данных — String. Как ясно из определения, в переменных такого типа можно сохранять строки.
Порой приходится быть непоследовательными. Мы с самого первого урока имеем дело со строками, а изучать их берёмся только сейчас.
Вначале поговорим об ограничениях, которые накладываются на переменные этого типа.
Когда при помощи процедур write и writeln мы выводили сообщения в программах на экран, то так или иначе касались строк. И строки эти мы обособляли одиночными кавычками — апострофами «’». Из этого вытекает первое ограничение: апостроф не может являться частью строки. Точнее, может, но его для этого нужно «экранировать», мы об этом поговорим позже.
Второе ограничение накладывается на длину передаваемых в программе строк. И длина эта не может превышать 255 символов. При этом на каждую переменную такого типа отводится до 256 байтов: 255 — собственно на строку, а в нулевом байте сохраняется реальная длина переданных данных. Вдумайтесь, для хранения чисел мы использовали 1, 2, 4 или 6 байтов памяти, а для строк отводится до 256 байтов! Если вспомнить, что Паскаль как язык программирования появился в 1968-1969 годах, и на тогдашних компьютерах было очень мало оперативной памяти, то отдавать по 256 байтов на данные какого-то одного типа — было почти расточительством. Сегодня же мы эту оперативку не считаем вовсе.
Если честно, то современные среды разработки позволяют сохранять в переменную типа String почти ничем не ограниченные строки. Строго говоря, ограничения всё-таки есть, но они находятся близко к объёму оперативной памяти вашего компьютера. Я же с самого начала решил рассказывать в своих статьях и видео о традиционном паскале, поэтому мы эту скользкую тему обойдём.
При наличии современных кодировок и кодовых страниц, я даже не берусь считать, сколько байтов отводит для хранения каждой переменной типа String наша среда разработки — Pascal ABC.Net. Однако и в прежние времена механизм хранения строк был относительно гибким.
1 байт = 8 битов. Бит — минимальная единица информации, в которой может в любой момент времени храниться 0 или 1. Если число состоит из восьми цифр, каждая из которых может принимать только два значения, то мы можем записать 28 различных чисел. 256 чисел от 0 до 255.
Если мы заранее знаем, что нам не будут нужны строки предельной длины, то объявляя переменную, можно указать не только тип, но и верхнее ограничение на размер, число меньше 255 символов.
Листинг 1.
program TypeString; var s: String[20]; BEGIN END.
При попытке сохранить большее количество символов (байтов) в объявленную таким образом переменную, Паскаль выдаст ошибку. Пример вышел так себе, мы только объявили в нём переменную. Теперь напишем совсем другую программу. В ней мы объявим две строковые переменные и с их помощью выведем на экран текст «Привет, мир!», то есть выполним те же действия, что и на первом нашем уроке. Также воспользуемся процедурой writeln, но на этот раз не будем помещать в неё строку в явном виде, а воспользуемся для этого двумя переменными.
Листинг 2.
program TypeString; var s1, s2: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; writeln(s1, s2); readln; END.
Кстати, если строковая переменная объявлена без ограничений, то в её нулевом байте также хранится реальный размер строки, а не гипотетические 255 байтов. В частности, длина переменной s1 из примера выше равна 8 символам, а для s2 — 4 символа.
Обратите внимание, разбив всю нужную нам фразу на две части и поместив эти части в переменные, мы позаботились о том, чтобы куда-то попал и пробел. Если бы мы этого не сделали, то тексты двух строк при выводе на экран слиплись бы. Выходит, одна из задач программиста заключается в том, чтобы следить за орфографией и построением фраз в программах.
Если бы строковые данные можно было только выводить на экран, то они не стоили бы даже отведённой на их хранение оперативной памяти. Например, строки можно складывать. Давайте перепишем второй пример так, как показано ниже и запустим нашу программу на исполнение.
Листинг 3.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; writeln(s3); readln; END.
В окне вывода данных PascalABC или в окне программы при её компиляции, вы увидите тот же результат, что и раньше, однако внутренне программа устроена и работает несколько иначе. В переменную s3 мы поместили результат «сложения» двух других строк — переменных s1 и s2. Пишу сложение в кавычках, так как это не сложение двух аргументов как в математике. Во всяком случае, от перемены мест «слагаемых» при использовании строк, зависит очень многое. Попробуйте у себя в примере поменять переменные s1 и s2 местами и снова запустите программу. Легко убедиться, что на экран по-прежнему выводится объединённая строка, вот только теперь в ней мало смысла. Итак, сложение строк называется мудрёным словом конкатенация и обозначает их объединение в том порядке, как они и записаны.
В новую переменную сначала помещается строка из первого аргумента, затем в её конец без каких-либо разделителей (о пробелах, если они нужны, мы должны позаботиться сами) помещается второй аргумент и так далее. Таким образом можно конкатенировать — объединять более двух строчек.
Кому-то милее знак сложения между строками, а кого-то он только путает. Что ж, в Паскале для конкатенации строк имеется специальная функция Concat, которой в скобках через запятую можно указать от двух и более аргументов-строк. Возможно, именно вам подобная форма записи покажется более наглядной.
Я обещал, что расскажу, как можно обмануть Паскаль и всё-таки поместить одиночную кавычку-апостроф в строку как её часть. Всё просто, для этого сам символ необходимо продублировать — написать слитно не один, а сразу два апострофа. Вот вам очередной пример:
Листинг 4.
program TypeString; var s1, s2: String; BEGIN s1 := 'Привет, '; s2 := 'Д''Артаньян'; writeln(s1, s2); readln; END.
Как видите, ничего сложного.
До этого момента значения переменным мы присваивали в явном виде, через операцию присваивания. Теперь же мы напишем программу, в которой попросим пользователя ввести некое значение с клавиатуры, а затем сохраним его в нашу переменную.
Листинг 5.
program TypeString; var s1: String; userName: String[20]; BEGIN s1 := 'Привет, '; write('Введите пожалуйста ваше имя: '); readln(userName); writeln(s1, userName); readln; END.
И снова ничего сложного, разница заключается лишь в том, что до сих пор мы просили в наших программах пользователя вводить числа, а теперь вот попросили строку. Программа вывела на экран просьбу ввести ваше имя, я написал своё, программа сохранила его в переменную, а затем вывела на экран приветствие, используя только что полученные с клавиатуры данные.
Когда мы непосредственно в программе присваиваем переменным какие-то строковые значения, нам несложно сосчитать длину этих строк, но как только мы вносим в программу интерактив — отдаём хотя бы на время управление пользователю, то теряем контроль над ситуацией и мы точно не сможем знать количество символов, хранимых в той или иной переменной типа String. А как быть, если нам необходимо узнать фактическую длину строковой переменной? Для этого у Паскаля есть функция Length. Она как раз и возвращает в качестве значения целое число — фактическую длину строки. Смотрите пример ниже.
Листинг 6.
program TypeString; var s1, s2, s3: String; i: Integer; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; i := length(s3); writeln('Длина строки, записанной в переменную s3 равна ', i); readln; END.
Кроме того, любую строку символов можно рассматривать в качестве массива, состоящего из отдельных элементов. Мы с вами ещё не проходили массивов, снова забегаем вперёд, но сегодня коснёмся этой темы лишь немного, а подробно поговорим о массивах в одном из ближайших уроков.
Для обращения к конкретному символу в строковой переменной следует после её имени в квадратных скобках передать его номер. Приведу ещё один пример:
Листинг 7.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; writeln(s3[1]); readln; END.
Запустив программу мы убеждаемся, что символы в строке нумеруются, начиная с единицы. Это вызывает путаницу у новичков. Очень многие сущности в программировании начинают нумероваться с нуля, а в строке нулевой байт отведён для хранения её фактической длины, это мы уже неоднократно обсуждали. Следовательно, номера элементов строки — обычные натуральные числа.
Прекрасно, распечатать первый, второй или третий символ из нашей строки мы можем. А как напечатать самый последний, да ещё и в том случае, когда нам не известна заранее длина строки? Здесь нам также поможет функция Length.
Листинг 8.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; writeln(s3[length(s3)]); readln; END.
Может показаться, что код выглядит громоздко. Если вам так кажется, воспользуйтесь листингом 7 и подставьте в квадратные скобки переменную i. Во всяком случае, в современных компьютерах более чем достаточно оперативки и от одной дополнительной переменной мы потеряем немного.
Мы уже умеем «складывать» строки, вычислять их длину, но всё ли это? — Нет. Мы также можем искать подстроку в строке. Причём, в качестве подстроки может выступать как небольшая строка, так и отдельные символы. Не буду вас томить, в Паскале имеется функция Pos, и работает она следующим образом: в скобках ей передаются два аргумента. Сначала мы должны указать что мы ищем, а затем — где мы это делаем. То есть сначала указывается подстрока или символ, а затем строка, где мы и ведём поиск. Наберите в среде разработки следующий пример и запустите программу на выполнение.
Листинг 9.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; writeln( pos('р', s3) ); readln; END.
Что мы видим? Во-первых, функция нашла только первое вхождение искомой подстроки. В результате напечаталось число 2 — буква «р» действительно находится во второй позиции в строке s3. Однако, предпоследний символ в этой строке — тоже буква «р», но до неё наша функция не дошла. Это всегда следует помнить! Функция Pos находит лишь первое вхождение подстроки в строке. Во-вторых, она ищет буквально то, что было велено. Если бы мы заставили искать в нашей строке прописную — заглавную «Р», то функция вернула бы нам 0, так как подобной буквы в нашей строке нет.
Как же быть, если строку будет вводить пользователь, и мы не знаем заранее, как именно он её внесёт с клавиатуры? — В этом случае обе строки — искомую фразу, и ту, где мы ведём поиск, желательно перевести в нижний или верхний регистр. Этой цели служат специальные функции Паскаля: LowerCase — переводит аргумент в строчные (маленькие) буквы, а UpperCase — в прописные (заглавные).
Причём, перед нами именно функции. LowerCase и UpperCase ничего не делают с переданными им аргументами. То есть и сами строки мы можем уберечь в том самом виде, как их внёс пользователь программы, и полученные результаты можем сохранить в других переменных, присвоив им значение наших функций.
В Паскале имеется функция Copy, которая позволяет копировать подстроки из строк. Перед нами снова функция, которая бережно обращается с переданными ей аргументами, но она возвращает значение, которое можно сохранить в переменной типа String. На этот раз нам необходимо передавать три аргумента: собственно строку — это может быть переменная или строка в явном виде, а также два целых числа, индекс — позицию в строке, начиная с которой мы копируем символы и количество копируемых символов.
Обратите внимание, мы не указываем подстроку для копирования в явном виде. Вместо этого мы указываем числа.
Листинг 10.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; writeln( copy(s3, 9, 3) ); readln; END.
Если вы запустите программу из десятого примера, то сможете убедиться, что на экране появится слово «мир». Во-первых, я не стал присваивать скопированное значение в строчную переменную, а сразу вывел на экран. Во-вторых, я немного схитрил. Зная, что именно сохранено в переменной s3, мне было легко вычислить позицию 9 — с которой собственно и начинается наше слово, ну а длина его мне была известна заранее. Когда мы имеем дело с не столь очевидными примерами, тут-то нам и может пригодиться функция Pos, которая могла бы найти индекс — первое число.
До сих пор мы имели дело с функциями, которые бережно относятся к переданным в скобках аргументам. Во всяком случае, вы можете доработать листинг 10 так, чтобы в этом убедиться. Добавьте ещё одну строковую переменную. Присвойте в неё значение функции Copy, а на экран выведите переменную s3. Легко будет убедиться, что данные в ней остались неизменными.
Теперь пришло время познакомиться с процедурой и это процедура Delete. Данная процедура удаляет подстроку. Здесь тоже удаляемая подстрока не указывается явно. Вместо этого из строчной переменной удаляются символы — их количество снова указывается числом, и удаление начинается с определённого символа в строке.
В процедуру Delete также как и в функцию Copy передаются три аргумента: строка и два целых числа. Вот только процедуры не возвращают значений. Выполненные ими действия не получится присвоить какой-то переменной, но процедуры часто меняют переданные им аргументы. Delete следит за тем, чтобы в качестве первого аргумента — строки, ей была передана не просто строка, но строковая переменная. В ней-то и будут происходить изменения.
Листинг 11.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; delete(s3, 7, 5); writeln(s3); readln; END.
Запускаем пример 11 и получаем в результате «Привет!». Что это значит? — В переменной s3 мы удалили 5 символов, начиная с седьмого. При этом, если в строке символов было больше, то все прочие — в нашем случае это восклицательный знак — никуда не исчезают. Тем не менее, мы удалили подстроку «, мир» — запятая, пробел и слово мир из нашей переменной s3. Процедура изменила сам аргумент.
Возможно мы уже обсуждали отличия процедур и функций, и уж точно мы ещё будем об этом говорить в дальнейшем, но сейчас хотелось бы обратить ваше внимание на тот факт, что функции бережно обращаются с переданными им аргументами, не меняют их значений, но всегда возвращают собственные, которые мы могли бы присвоить переменным, а процедуры почти всегда меняют переданные аргументы или их часть. Впрочем, для этого, переданные аргументы должны являться переменными.
Коль скоро есть процедура Delete, удаляющая подстроку в строковой переменной, есть также процедура Insert, которая вставляет подстроку, но ей аргументы передаются несколько иначе. Смотрим очередной пример.
Листинг 12.
program TypeString; var s1, s2, s3: String; BEGIN s1 := 'Привет, '; s2 := 'мир!'; s3 := s1 + s2; delete(s3, 9, 3); insert('Владимир', s3, 9); writeln(s3); readln; END.
В этой программе я использовал обе процедуры. Сначала из строки «Привет, мир!» я удаляю 3 символа, начиная с девятого — удаляю слово «мир». Затем добавляю строчку «Владимир» с того же девятого символа. Таким образом, я заменяю слово «мир» собственным именем.
В процедуру Insert аргументы подаются в следующем порядке: первым идёт строка, которую мы собираемся вставить, она может быть задана как переменная или явно. Вторым аргументом мы указываем переменную типа String, в которую и будет производиться вставка. В последнюю очередь указывают число — номер символа, начиная с которого и должна быть произведена вставка.
Урок подзатянулся, но он будет неполным, если мы не поговорим ещё об одной возможности — строки можно сравнивать.
Напишем очередную короткую программу.
Листинг 13.
program TypeString; var s1, s2: String; BEGIN s1 := 'Ваня'; s2 := 'Вова'; if s1 >= s2 then writeln(s1, ' больше или равно ', s2) else writeln(s2, ' больше ', s1); readln; END.
На этот раз оставляем лишь две строковые переменные. Присвоим им похожие имена. Дальше воспользуемся материалами прошлого урока — устроим логическое ветвление программы по условию.
Если вы запустите программу, то легко сможете убедиться, что переменная s2, содержащая «Вова», оказывается строго больше переменной s1, в которой записано имя «Ваня».
Мы уже говорили, что строки можно интерпретировать как массив, состоящий из отдельных символов. И когда нам в голову приходит сравнить между собою строки, происходит последовательное сравнивание символов каждой из строк. А вернее, сравниваются между собою числа, которыми кодируются символы в той или иной кодовой странице (кодировке). Однако, об этом мы поговорим в далёком 16 уроке.
Чем дальше та или иная буква от начала алфавита, тем больше код, которым она кодируется. В этом смысле, русская буква «о» явно больше буквы «а» — которая в алфавите стоит первой.
В дальнейших уроках мы ещё неоднократно будем касаться строк и строковых переменных, но на сегодня это всё. Дочитавшим до конца — бонус, «кино» на заданную тему.
Репозиторий листингов программ.
Оставьте ваш отзыв:
Форум программистов Vingrad
Модераторы: Poseidon |
Поиск: |
|
[Pascal]Найти буквы и вывести слова, Работа со строками… |
Опции темы |
CHITER |
|
||
Новичок Профиль
Репутация: нет
|
Найти в предложении все слова, в которых встречаются первые три буквы первого слова предложения. |
||
|
|||
volvo877 |
|
||
Эксперт Профиль Репутация: 34
|
Для домашних заданий, курсовых, существует «Центр Помощи» Тема перенесена! |
||
|
|||
Rodman |
|
||
CIO Профиль
Репутация: 26
|
——————— CRM с функцией АвтоОбзвона Лотереи мира |
||
|
|||
mr.Anderson |
|
||
iOS Lead Developer Профиль
Репутация: 16
|
Rodman, просто до этого тема в паскале была, поэтому и язык не указан. Паскаль, поправьте. Добавлено через 13 минут и 5 секунд Это сообщение отредактировал(а) mr.Anderson — 10.10.2008, 20:58 ——————— |
||
|
|||
mr.Anderson |
|
||
iOS Lead Developer Профиль
Репутация: 16
|
Готово!
Это сообщение отредактировал(а) mr.Anderson — 10.10.2008, 21:14 ——————— |
||
|
|||
CHITER |
|
||
Новичок Профиль
Репутация: нет
|
благодарю! |
||
|
|||
THandle |
|
||
Хранитель Клуба Профиль
Репутация: 30
|
Хоть вопрос и решен, но вот мой вариант. ИМХО, более наглядный.
Это сообщение отредактировал(а) THandle — 13.10.2008, 18:37 |
||
|
|||
|
Правила форума «Центр помощи» | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Центр помощи | Следующая тема » |