Как найти букву в строке pascal
Перейти к содержимому

Как найти букву в строке pascal

  • автор:

Массивы и строки

Есть задача: Дан текст (массив символьных строк), каждый символ которого может быть буквой, цифрой или одним из знаков +, -, *. Подсчитать число вхождений буквы f в первые три группы букв. Решить нужно на pascal. С числами еще понятно. А вот с символами. Не соображу, как заполнить массив случайным образом, чтобы были, и буквы, и цифры, и знаки +, -, *. При этом параметры массива нужно, чтобы определялись с клавиатуры. Все это должно быть в двух процедурах. Одна для ввода матрицы. Вторая для вывода матрицы на экран. Или такой возможности в Паскаль нет? Тогда лучше вводить строки с клавиатуры? Потом подсчет в первые три группы букв. Это имеется ввиду, что в строке может быть например, пять слов, разделенных пробелами, и поиск буквы f выполнить только в первых трех словах. Я правильно поняла? Как же это можно реализовать? Покажите, пожалуйста, пример, а то со вчерашнего дня мозги с этой задачей уже на бекрень:)

Отслеживать
80.8k 9 9 золотых знаков 78 78 серебряных знаков 134 134 бронзовых знака
задан 18 янв 2012 в 3:55
elenavictory elenavictory
320 3 3 золотых знака 7 7 серебряных знаков 23 23 бронзовых знака

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Сгенерировать массив, состоящий из случайных строк, можно разными способами: задать алфавит, из которого будет состоять каждая строка или выбирать случайный символ по коду из кодировки. Я использовал первый способ.

Const N0=100; (* число элементов массива и массив-алфавит *) Alf: Array[0..38] Of Char = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '+', '-', '*', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'); Var StrMas: Array[0..N0-1] Of String; i, j, n, l: Byte; AlfInd: 0..38; begin Repeat (* проверочка ввода числа элементов *) Write('N = '); ReadLn(N); Until (N In [1..99]); Dec(N); (* вычитаю 1 (N:=N-1; - то же самое) *) Randomize; For i:=0 To N Do (* мотаю цикл от 0 до число элементов - 1 *) Begin StrMas[i]:=''; (* элемент сначала равен пустому символу *) l:=Random(50)+1; (* случайная длина строки, но не меньше 1 *) For j:=1 To L Do (* мотаю цикл от 1 до длины будущей строки *) StrMas[i]:=StrMas[i]+Alf[Random(38)]; (* заполняю случайными элементами *) End; (* вывожу массив *) For i:=0 To N Do WriteLn(StrMas[i]); WriteLn('Davi na ENTER. '); ReadLn; end. 

А вторая часть задания требует дополнительных пояснений: в задаче не указано, что в строках могут быть пробелы, поэтому группа букв, скорее всего, что-то другое: элемент массива, или определённое количество символов (заранее известное), или что-то ещё.

Символы и строки в PascalABC.NET

Символы имеют тип char, занимают 2 байта и хранятся в кодировке Unicode (UTF-16).

var c1: char; var c2 := 'z'; 

Для преобразования символа c в код используется функция Ord(c) , для обратного преобразования кода i в символ используется функция Chr(i) .

begin var c := 'ю'; Print(Ord(c)); // 1102 Print(Chr(1102)); // ю end. 

Классический способ определить символ, следующий за данным в кодовой таблице, — это преобразовать символ в код, прибавить к коду число и потом преобразовать полученный код снова в символ:

Chr(Ord(c)+1) 

Аналогично определяется предыдущий символ

Методы типа char

Методы, встроенные в тип char, делятся на две категории:

  • проверяющие, принадлежит ли символ указанной категории: c.IsDigit , c.IsLetter , c.IsLower , c.IsUpper
  • преобразующие символ: c.ToUpper , c.ToLower , c.ToDigit .

Отметим также, что c.IsLower возвращает True только если это буква в нижнем регистре — для не букв возвращается False .

Строки

Введение

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

Основная причина — многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.

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

Индексация строк

Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам — s[i] .

begin var s: string; s := 'тор'; Print(s[1],s[2],s[3]); end. 

Символы строк можно менять:

begin var s := 'пир'; s[1] := 'м'; Print(s); // мир end. 

Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца

begin var s := 'мир'; s[^1] := 'г'; Print(s); // миг end. 

Циклы по строкам

begin var s := 'привет'; for var i:=1 to s.Length do s[i] := Chr(Ord(s[i])+1); Print(s); end. 
foreach var c in s do Print(c); 

Операции +, *n и in

Строки можно складывать и умножать на целое положительное число

Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’

Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’

begin var s := ''; for var c := 'a' to 'z' do s += c; end. 

Методы Count, CountOf, Where

Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf

begin var s := 'абракадабра'; s.CountOf('а').Print; s := 'а123бр45а67к89адабра'; s.Count(c -> c.IsDigit).Print; end. 

Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:

begin var s := 'а123бр45а67к89адабра'; s := s.Where(c -> c.IsLetter).JoinToString; end. 

s.ToWords и разбиение строки на слова

Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:

begin var s := 'как однажды жак звонарь головой сломал фонарь'; var a := s.ToWords; Sort(a); s := a.JoinToString end. 

По умолчанию JoinToString разделяет слова пробелами

Функция Pos и процедуры Delete, Insert

Pos(subs,s) возвращает позицию первого вхождения подстроки subs в сторке s или 0 если подстрока не найдена

Pos(subs,s,from) начинает искать подстроку в строке с позиции from .

Следующий код выводит позиции всех вхождений s1 в s:

begin var s := 'абракадабра'; var s1 := 'бра'; var p := Pos(s1,s); while p>0 do begin Print(p); p := Pos(s1,s,p+s1.Length); end; end. 

©2023 PascalABCNET Team. All rights reserved.
Page last updated: 19.12.2020
Site last generated: Jul 31, 2023

Функция для поиска буквы в строке

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
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.

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

Вопрос: Как сделать программу проще и надежнее.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Функция для поиска в строке другой строки
Привет, чёто переклинело. есть функция strrbrk($string,"%HC@"); которая ищет один из символов в.

Функция поиска строки в строке
Здравствуйте! Не могли бы вы посмотреть в чем я накосячил в коде ? Не могу понять. Задача.

Функция поиска слов в строке
Добрый вечер. Мне нужно написать следующие функции: Первые три функции я написал и.

Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181

1 2 3 4
function find(arg: string; ch: char): boolean; begin find:=pos(ch,arg)>0; end;

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Функция поиска слов в строке
Ребят, помогите разобраться. Никак не могу сообразить как риализовать данную функцию. P.S нужно.

Рекурсивная функция поиска символов ‘0’ в строке
задача в том что дана массив надо найти в строке сколько ‘0’ символов есть после символа ‘х’..и по.

Функция поиска группы символов в строке
Нужна функция для поиска группы букв в строке. Сколько букв неизвестно точно от 2 и больше пробовал.

Функция преобразует буквы верхнего регистра в строке s в буквы нижнего регистра
Задание: strlwr char *strlwr( char *s); Функция преобразует буквы верхнего регистра в строке s.

Как найти букву в строке pascal

Функция Pos в Паскале ищет подстроку в строке. Синтаксис функции имеет довольно много вариантов для разных типов данных:

Вся эта куча вариантов взята из документации. Так что просьба не критиковать за излишние подробности )))

Функция Pos возвращает индекс подстроки Substr в строке S, если строка S содержит в себе подстроку Substr. Если подстрока Substr не найдена в строке, то функция возвращает 0. Поиск чувствителен к регистру.

Как найти подстроку в строке

Разумеется, сделать это можно без использования специальных функций.

Проще всего найти в строке символ — это можно сделать простым перебором символов в строке.

Найти вхождение подстроки из нескольких символов будет сложнее. Но тоже возможно — существуют специальные алгоритмы.

Однако зачем “изобретать велосипед”, если есть готовые функции. Такие, например, как функция Pos.

С помощью этой функции можно найти символ или подстроку в строке.

Как часто приходится это делать? Зависит от специфики вашей работы.

Если вы работаете, например, с математикой, то почти никогда.

Если же вы работаете с большими объёмами текстовой информации, с файлами, то довольно часто.

В принципе, здесь всё понятно. Особых разъяснений не требуется.

Единственное замечание по варианту поиска подстроки cde. Как видите, в исходной строке есть две подстроки cde. Но функция возвращает число 3, то есть индекс первого элемента первой найденной подстроки.

program posfunc; var S : string; begin //Ищем индекс первого пробела в строке S := ‘The first space in this sentence is at position : ‘; Writeln(S, Pos(‘ ‘, S)); //Pos = 4 //Ищем последнюю букву английского алфавита в строке S := ‘The last letter of the alphabet doesn»t appear in this sentence ‘; //Так как такой буквы в строке нет, то будет выведено сообщение об этом if (Pos(‘Z’, S) = 0) and (Pos(‘z’, S) = 0) then Writeln(S); //Проверяем, что функция Pos действительно чувствительна к регистру S := ‘abcdefgcde’; Writeln(Pos(‘f’, S)); //Pos = 6 Writeln(Pos(‘F’, S)); //Pos = 0 — буква F не найдена Writeln(Pos(‘cde’, S)); //Pos = 3, потому что функция //возвращает индекс первого //найденного вхождения Writeln(Pos(‘cdf’, S)); //Pos = 0 — такой подстроки нет ReadLn; end.

Функция для поиска буквы в строке

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

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

Вопрос: Как сделать программу проще и надежнее.

Функция для поиска в строке другой строки
Привет, чёто переклинело. есть функция strrbrk($string,"%HC@"); которая ищет один из символов в.

Функция поиска строки в строке
Здравствуйте! Не могли бы вы посмотреть в чем я накосячил в коде ? Не могу понять. Задача.

Функция поиска слов в строке
Добрый вечер. Мне нужно написать следующие функции: Первые три функции я написал и.

Функция поиска слов в строке
Ребят, помогите разобраться. Никак не могу сообразить как риализовать данную функцию. P.S нужно.

Рекурсивная функция поиска символов ‘0’ в строке
задача в том что дана массив надо найти в строке сколько ‘0’ символов есть после символа ‘х’..и по.

Функция поиска группы символов в строке
Нужна функция для поиска группы букв в строке. Сколько букв неизвестно точно от 2 и больше пробовал.

Функция преобразует буквы верхнего регистра в строке s в буквы нижнего регистра
Задание: strlwr char *strlwr( char *s); Функция преобразует буквы верхнего регистра в строке s.

Как найти букву в строке pascal

Собственно сама задача:
Составить программу, выполняющую следующее задание: дана строка символов.
Выяснить, входит ли в строку буква “ж”.

Она работает, но не правильно из-за строчки if str=’j’ then (т.к. строка не равна одному символу вот он и выводит по ветви else) Подскажите как поправить?

И еще если может\знает кто на записи задачка, гляньте)
Составить программу с использованием записей для выполнения указанного ниже задания.
Заданы проекции вектора на оси координат X и Y. Найти его модуль.

String – строчный тип данных, процедуры и функции для работы со строками

Сегодня мы познакомимся со строковым типом данных — String. Как ясно из определения, в переменных такого типа можно сохранять строки.

Вначале поговорим об ограничениях, которые накладываются на переменные этого типа.

Когда при помощи процедур write и writeln мы выводили сообщения в программах на экран, то так или иначе касались строк. И строки эти мы обособляли одиночными кавычками — апострофами «’». Из этого вытекает первое ограничение: апостроф не может являться частью строки. Точнее, может, но его для этого нужно «экранировать», мы об этом поговорим позже.

Второе ограничение накладывается на длину передаваемых в программе строк. И длина эта не может превышать 255 символов. При этом на каждую переменную такого типа отводится до 256 байтов: 255 — собственно на строку, а в нулевом байте сохраняется реальная длина переданных данных. Вдумайтесь, для хранения чисел мы использовали 1, 2, 4 или 6 байтов памяти, а для строк отводится до 256 байтов! Если вспомнить, что Паскаль как язык программирования появился в 1968-1969 годах, и на тогдашних компьютерах было очень мало оперативной памяти, то отдавать по 256 байтов на данные какого-то одного типа — было почти расточительством. Сегодня же мы эту оперативку не считаем вовсе.

При наличии современных кодировок и кодовых страниц, я даже не берусь считать, сколько байтов отводит для хранения каждой переменной типа String наша среда разработки — Pascal ABC.Net. Однако и в прежние времена механизм хранения строк был относительно гибким.

Если мы заранее знаем, что нам не будут нужны строки предельной длины, то объявляя переменную, можно указать не только тип, но и верхнее ограничение на размер, число меньше 255 символов.

При попытке сохранить большее количество символов (байтов) в объявленную таким образом переменную, Паскаль выдаст ошибку. Пример вышел так себе, мы только объявили в нём переменную. Теперь напишем совсем другую программу. В ней мы объявим две строковые переменные и с их помощью выведем на экран текст «Привет, мир!», то есть выполним те же действия, что и на первом нашем уроке. Также воспользуемся процедурой writeln, но на этот раз не будем помещать в неё строку в явном виде, а воспользуемся для этого двумя переменными.

Обратите внимание, разбив всю нужную нам фразу на две части и поместив эти части в переменные, мы позаботились о том, чтобы куда-то попал и пробел. Если бы мы этого не сделали, то тексты двух строк при выводе на экран слиплись бы. Выходит, одна из задач программиста заключается в том, чтобы следить за орфографией и построением фраз в программах.

Если бы строковые данные можно было только выводить на экран, то они не стоили бы даже отведённой на их хранение оперативной памяти. Например, строки можно складывать. Давайте перепишем второй пример так, как показано ниже и запустим нашу программу на исполнение.

В окне вывода данных PascalABC или в окне программы при её компиляции, вы увидите тот же результат, что и раньше, однако внутренне программа устроена и работает несколько иначе. В переменную s3 мы поместили результат «сложения» двух других строк — переменных s1 и s2. Пишу сложение в кавычках, так как это не сложение двух аргументов как в математике. Во всяком случае, от перемены мест «слагаемых» при использовании строк, зависит очень многое. Попробуйте у себя в примере поменять переменные s1 и s2 местами и снова запустите программу. Легко убедиться, что на экран по-прежнему выводится объединённая строка, вот только теперь в ней мало смысла. Итак, сложение строк называется мудрёным словом конкатенация и обозначает их объединение в том порядке, как они и записаны.

Кому-то милее знак сложения между строками, а кого-то он только путает. Что ж, в Паскале для конкатенации строк имеется специальная функция Concat, которой в скобках через запятую можно указать от двух и более аргументов-строк. Возможно, именно вам подобная форма записи покажется более наглядной.

Как видите, ничего сложного.

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

И снова ничего сложного, разница заключается лишь в том, что до сих пор мы просили в наших программах пользователя вводить числа, а теперь вот попросили строку. Программа вывела на экран просьбу ввести ваше имя, я написал своё, программа сохранила его в переменную, а затем вывела на экран приветствие, используя только что полученные с клавиатуры данные.

Когда мы непосредственно в программе присваиваем переменным какие-то строковые значения, нам несложно сосчитать длину этих строк, но как только мы вносим в программу интерактив — отдаём хотя бы на время управление пользователю, то теряем контроль над ситуацией и мы точно не сможем знать количество символов, хранимых в той или иной переменной типа String. А как быть, если нам необходимо узнать фактическую длину строковой переменной? Для этого у Паскаля есть функция Length. Она как раз и возвращает в качестве значения целое число — фактическую длину строки. Смотрите пример ниже.

Кроме того, любую строку символов можно рассматривать в качестве массива, состоящего из отдельных элементов. Мы с вами ещё не проходили массивов, снова забегаем вперёд, но сегодня коснёмся этой темы лишь немного, а подробно поговорим о массивах в одном из ближайших уроков.

Для обращения к конкретному символу в строковой переменной следует после её имени в квадратных скобках передать его номер. Приведу ещё один пример:

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

Прекрасно, распечатать первый, второй или третий символ из нашей строки мы можем. А как напечатать самый последний, да ещё и в том случае, когда нам не известна заранее длина строки? Здесь нам также поможет функция Length.

Может показаться, что код выглядит громоздко. Если вам так кажется, воспользуйтесь листингом 7 и подставьте в квадратные скобки переменную i. Во всяком случае, в современных компьютерах более чем достаточно оперативки и от одной дополнительной переменной мы потеряем немного.

Мы уже умеем «складывать» строки, вычислять их длину, но всё ли это? — Нет. Мы также можем искать подстроку в строке. Причём, в качестве подстроки может выступать как небольшая строка, так и отдельные символы. Не буду вас томить, в Паскале имеется функция Pos, и работает она следующим образом: в скобках ей передаются два аргумента. Сначала мы должны указать что мы ищем, а затем — где мы это делаем. То есть сначала указывается подстрока или символ, а затем строка, где мы и ведём поиск. Наберите в среде разработки следующий пример и запустите программу на выполнение.

Что мы видим? Во-первых, функция нашла только первое вхождение искомой подстроки. В результате напечаталось число 2 — буква «р» действительно находится во второй позиции в строке s3. Однако, предпоследний символ в этой строке — тоже буква «р», но до неё наша функция не дошла. Это всегда следует помнить! Функция Pos находит лишь первое вхождение подстроки в строке. Во-вторых, она ищет буквально то, что было велено. Если бы мы заставили искать в нашей строке прописную — заглавную «Р», то функция вернула бы нам 0, так как подобной буквы в нашей строке нет.

Как же быть, если строку будет вводить пользователь, и мы не знаем заранее, как именно он её внесёт с клавиатуры? — В этом случае обе строки — искомую фразу, и ту, где мы ведём поиск, желательно перевести в нижний или верхний регистр. Этой цели служат специальные функции Паскаля: LowerCase — переводит аргумент в строчные (маленькие) буквы, а UpperCase — в прописные (заглавные).

В Паскале имеется функция Copy, которая позволяет копировать подстроки из строк. Перед нами снова функция, которая бережно обращается с переданными ей аргументами, но она возвращает значение, которое можно сохранить в переменной типа String. На этот раз нам необходимо передавать три аргумента: собственно строку — это может быть переменная или строка в явном виде, а также два целых числа, индекс — позицию в строке, начиная с которой мы копируем символы и количество копируемых символов.

Обратите внимание, мы не указываем подстроку для копирования в явном виде. Вместо этого мы указываем числа.

Если вы запустите программу из десятого примера, то сможете убедиться, что на экране появится слово «мир». Во-первых, я не стал присваивать скопированное значение в строчную переменную, а сразу вывел на экран. Во-вторых, я немного схитрил. Зная, что именно сохранено в переменной s3, мне было легко вычислить позицию 9 — с которой собственно и начинается наше слово, ну а длина его мне была известна заранее. Когда мы имеем дело с не столь очевидными примерами, тут-то нам и может пригодиться функция Pos, которая могла бы найти индекс — первое число.

До сих пор мы имели дело с функциями, которые бережно относятся к переданным в скобках аргументам. Во всяком случае, вы можете доработать листинг 10 так, чтобы в этом убедиться. Добавьте ещё одну строковую переменную. Присвойте в неё значение функции Copy, а на экран выведите переменную s3. Легко будет убедиться, что данные в ней остались неизменными.

Теперь пришло время познакомиться с процедурой и это процедура Delete. Данная процедура удаляет подстроку. Здесь тоже удаляемая подстрока не указывается явно. Вместо этого из строчной переменной удаляются символы — их количество снова указывается числом, и удаление начинается с определённого символа в строке.

Запускаем пример 11 и получаем в результате «Привет!». Что это значит? — В переменной s3 мы удалили 5 символов, начиная с седьмого. При этом, если в строке символов было больше, то все прочие — в нашем случае это восклицательный знак — никуда не исчезают. Тем не менее, мы удалили подстроку «, мир» — запятая, пробел и слово мир из нашей переменной s3. Процедура изменила сам аргумент.

Коль скоро есть процедура Delete, удаляющая подстроку в строковой переменной, есть также процедура Insert, которая вставляет подстроку, но ей аргументы передаются несколько иначе. Смотрим очередной пример.

В этой программе я использовал обе процедуры. Сначала из строки «Привет, мир!» я удаляю 3 символа, начиная с девятого — удаляю слово «мир». Затем добавляю строчку «Владимир» с того же девятого символа. Таким образом, я заменяю слово «мир» собственным именем.

Урок подзатянулся, но он будет неполным, если мы не поговорим ещё об одной возможности — строки можно сравнивать.

Напишем очередную короткую программу.

На этот раз оставляем лишь две строковые переменные. Присвоим им похожие имена. Дальше воспользуемся материалами прошлого урока — устроим логическое ветвление программы по условию.

Если вы запустите программу, то легко сможете убедиться, что переменная s2, содержащая «Вова», оказывается строго больше переменной s1, в которой записано имя «Ваня».

Чем дальше та или иная буква от начала алфавита, тем больше код, которым она кодируется. В этом смысле, русская буква «о» явно больше буквы «а» — которая в алфавите стоит первой.

В дальнейших уроках мы ещё неоднократно будем касаться строк и строковых переменных, но на сегодня это всё. Дочитавшим до конца — бонус, «кино» на заданную тему.

Похожие публикации:

  1. Как изменить текст в css
  2. Как изменить цвет картинки при наведении css
  3. Как установить модули node js
  4. Как формируется css в october cms

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *