Паскаль строки как найти только буквы

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

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses crt;
 const b=['a'..'z','A'..'Z','а'..'я','А'..'Я'];
 
var
  s:String;
  i:Integer;
BEGIN
readln(s);
for i:=1 to length(s) do
if s[i] in b then Writeln('Буква')
   else Writeln('не знаю');
END.



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

Pascal
1
2
3
for i:=1 to length(s) do
if s[i] not in ['0'..'9'] then Writeln('Буква')
   else Writeln('не знаю');



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

Pascal
1
2
3
4
5
6
7
8
9
10
const bk=['A'..'Z','a'..'z',А''..'п','р'..'ё'];
........................................
repeat
k:=0;
writeln('Введите строку из букв:');
readln(s);
for i:=1 to length(s) do
if not(s[i] in bk) then k:=1;
if k=1 then writeln('Введены не только буквы, повторите ввод');
until k=0;



0



WatsOne

36 / 37 / 13

Регистрация: 10.10.2010

Сообщений: 115

24.10.2010, 10:29

9

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var s:string;
k:integer;
check:boolean;
begin
 writeln('Строка:');
 readln(s);
 check:=true;
 for k:=1 to length(s) do 
  if ((ord(s[k])>=65)and(ord(s[k])<=90))or
     ((ord(s[k])>=97)and(ord(s[k])<=122))or
     ((ord(s[k])>=192)and(ord(s[k])<=255)) then {nothing}
  else check:=false;
 if check then writeln('Введены только буквы')
 else writeln('Введён недопустимый символ');
end.



0



Puporev

Почетный модератор

64287 / 47586 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

24.10.2010, 10:35

10

Или проверять при вводе

Pascal
1
2
3
4
5
6
7
8
var c:char;
..........................................
writeln('Введите строку из букв, окончание ввода точка:');
s:='';
repeat
read(c);
if c in bk then s:=s+c;
until c-'.';

Добавлено через 2 минуты
Или еще так.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses crt;
var c:char;
     s:string;
begin
clrscr;
writeln('Введите строку из букв, окончание ввода точка:');
s:='';
repeat
c:=readkey;
if not(c in bk) then c:=#0
else s:=s+c;
until c='.';



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
1
2
3
4
5
6
7
8
9
10
11
var s:string[30];
    n,i:integer;
begin
 writeln('введите текст');
 readln(s);
 n:=0;
 for i:=1 to length(s) do
     if s[i]='f' then
        n:=n+1;
 write('в тексте букв f = ',n)
end.
1
2
3
4
5
6
7
8
begin
  var s := readString('введите текст');
  var n := 0;
  foreach var c in s do
    if c = 'f' then
      inc(n);
  Print(n);
end.
 

Операции со строками:

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const
  m = ['0'..'9'];
 
var
  s: string;
  i, k: byte;
 
begin
  read(s);
  k := 0;
  for i := 1 to length(s) do
    if s[i] in m then inc(k);
  writeln('цифр  = ', k);
  readln;
end.
1
2
3
4
5
6
7
8
begin
  var s := readString;
  var k := 0;
  foreach var c in s do
    if char.IsDigit(c) then
      k += 1;
  Print($'цифр  = {k}');
end.

Пример: Определить является ли данное слово перевертышем (палиндромом).

Показать решение:

Паскаль PascalAbc.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
var a,b,c:string;
    i:longint;
begin
write('введите слово:');
readln(a);
b:='';
for i:=1 to length(a) do
    b:=a[i]+b;
if a=b then
   write('перевертыш')
   else
   write('не перевертыш');
end.
1
2
3
4
5
6
7
8
9
10
// с помощью среза
begin
  var s := readString;
  var n := s.Length;
  var s1 := s[::-1];
  if s = s1 then
    print('перевертыш')
  else
    print('не перевертыш');
end.

String 5. Составить программу подсчета количества встречаемых в тексте сочетаний букв «ма».

String 6. Определить, встречается ли в тексте сочетание букв «ку».

Пример выполнения:

Введите строку:
Кума
Результат: да
Введите строку:
Дед
Результат: нет

String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).

Пример выполнения:

Введите строку:
Барабулька
Введите букву, которую заменить:
а
Введите букву, на которую заменить:
у
Результат: Бурубульку

String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».

String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:

Пример выполнения:

Введите строку:
1234567891011слово следующееСлово иСледСлово
Слово с максимальным количеством букв:
следующееСлово 

Алгоритм:

  • После того как строка считывается (вводится), измеряется ее длина (функция length).
  • Далее стока просматривается посимвольно в цикле while или for.
  • Если символ строки входит в множество букв (const letters=['a'..'z'];), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string).
  • Если символ равен пробелу, то увеличиваем счетчик для массива слов и переходим к следующей итерации цикла.
  • String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:

    Алгоритм:

  • В цикле до конца длины строки выполняем: если текущий символ строки — не пробел, то формируем элемент массива arrayS (arrayS: array[1..100] of string; строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].
  • При достижении пробела переходим к следующему элементу arrayS[k] и начинаем формировать следующее слово.
  • После того, как массив из всех слов arrayS сформирован: выполняем сортировку массива по длине букв в словах.
  • 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 строк, в каждой из которых – информация о студенте в формате:
    <Фамилия> <год рождения> <оценка>

    1. Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
    2. Вывести фамилии студентов, у которых оценка 2.
    3. Вывести фамилии студентов, родившихся в 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
    Дата 10.10.2008, 20:11 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Новичок

    Профиль
    Группа: Участник
    Сообщений: 13
    Регистрация: 14.7.2007
    Где: Пенза

    Репутация: нет
    Всего: нет

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

    PM MAIL WWW ICQ   Вверх
    volvo877
    Дата 10.10.2008, 20:31 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Эксперт
    ****

    Профиль
    Группа: Комодератор
    Сообщений: 2072
    Регистрация: 15.11.2004

    Репутация: 34
    Всего: 116

    Для домашних заданий, курсовых, существует «Центр Помощи»

    Тема перенесена! 

    PM MAIL   Вверх
    Rodman
    Дата 10.10.2008, 20:44 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    CIO
    ****

    Профиль
    Группа: Участник
    Сообщений: 6144
    Регистрация: 7.5.2006
    Где: Ukraine ⇛ Kyiv ci ty

    Репутация: 26
    Всего: 122

    M Модератор: Название темы должно содержать язык написания!

    ———————

    CRM с функцией АвтоОбзвона

    Лотереи мира

    PM MAIL WWW Skype GTalk YIM MSN   Вверх
    mr.Anderson
    Дата 10.10.2008, 20:58 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    iOS Lead Developer
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 3374
    Регистрация: 20.12.2004
    Где: далеко

    Репутация: 16
    Всего: 128

    Rodman, просто до этого тема в паскале была, поэтому и язык не указан. smile Паскаль, поправьте.

    Добавлено через 13 минут и 5 секунд
    Решаю…

    Это сообщение отредактировал(а) mr.Anderson — 10.10.2008, 20:58

    ———————

    user posted image

    user posted image

    PM MAIL ICQ Skype   Вверх
    mr.Anderson
    Дата 10.10.2008, 21:13 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    iOS Lead Developer
    ****

    Профиль
    Группа: Участник Клуба
    Сообщений: 3374
    Регистрация: 20.12.2004
    Где: далеко

    Репутация: 16
    Всего: 128

    Готово!

    Код

    program SearchingOfLetters;

    var
     s : String;  //предложение
     w : String;  //слово
     i : Integer; //счетчик
     l : Integer; //длина предложения
     x : Array [1..3] of Char; //массив букв, которые будем искать
     m : Integer; //с этого индекса начнем искать (первое слово пропускаем)

    function findLetters(w: String): Boolean;
    var
     j : Integer;
     k : Integer;
     u : Integer;
    begin
     Result := False;

     u := Length(w);

     for j:=1 to 3 do
      for k:=1 to u do
       if (w[k] = x[j]) then //нашли букву
       begin
        findLetters := True;
        break;
       end;
    end;

    begin
     readln(s);

     for i:=1 to 3 do
      x[i] := s[i];

     l := Length(s);

     for i:=3 to l do
      if (s[i] = ' ') then
      begin
       m := i;
       break;
      end;

     //ищем уже от запомненного индекса, пропуская первое слово
     for i:=m to l do
     begin
      if (s[i] = ' ') then
      begin
       if (w <> '') then
        if (findLetters(w)) then
         writeln(w);

       w := '';
      end
      else w := w + s[i];
     end;

     readln;
    end.

    Это сообщение отредактировал(а) mr.Anderson — 10.10.2008, 21:14

    ———————

    user posted image

    user posted image

    PM MAIL ICQ Skype   Вверх
    CHITER
    Дата 10.10.2008, 22:25 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Новичок

    Профиль
    Группа: Участник
    Сообщений: 13
    Регистрация: 14.7.2007
    Где: Пенза

    Репутация: нет
    Всего: нет

    благодарю! smile 

    PM MAIL WWW ICQ   Вверх
    THandle
    Дата 11.10.2008, 15:11 (ссылка)
    | (нет голосов)
    Загрузка ... Загрузка …




    Быстрая цитата

    Цитата

    Хранитель Клуба
    Group Icon
    Награды: 1

    Профиль
    Группа: Админ
    Сообщений: 3639
    Регистрация: 31.7.2007
    Где: Moscow, Dubai

    Репутация: 30
    Всего: 372

    Хоть вопрос и решен, но вот мой вариант. ИМХО, более наглядный.

    Код

    program Project1;

    var
      S: String;
      Position: Integer;
      W: String;
      F: String[3];
      StrLen: Integer;

    function FindWord: String;
    var
      tmpStr: String;
    begin
      tmpStr := '';
      repeat
        Inc(Position);
        if S[Position] <> ' ' then
          tmpStr := tmpStr + S[Position];
      until (S[Position] = ' ');
      FindWord := tmpStr;
    end;

    begin
      ReadLn(S);
      Position := 0;
      S := S + ' ';
      StrLen := Length(S);
      W := FindWord;
      if Length(W) < 3 then
        Exit;
      F := Copy(W, 1, 3);
      repeat
        W := FindWord;
        if Pos(F, W) <> 0 then
          WriteLn(W);
      until Position >= StrLen;
      ReadLn;
    end.

    Это сообщение отредактировал(а) THandle — 13.10.2008, 18:37

    PM   Вверх



















    Ответ в темуСоздание новой темы
    Создание опроса
    Правила форума «Центр помощи»

    ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
    Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!

    • Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
    • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
    • В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
    • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
    • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
    • Помните: один топик — один вопрос!
    • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
    • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
    • Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.

    Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.


    Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

     

    0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
    0 Пользователей:
    « Предыдущая тема | Центр помощи | Следующая тема »

    Понравилась статья? Поделить с друзьями:
  • Как найти толщину пленки формула
  • Как составить ктп по истории
  • Как найти человека в краснокамске
  • Как найти тропы в произведении
  • Как найти боковую панель в опере