0 / 0 / 0 Регистрация: 13.02.2009 Сообщений: 10 |
|
1 |
|
Поиск повторяющихся символов в строках13.02.2009, 18:47. Показов 11098. Ответов 11
Ребята помогите пожалуйста вот такую задачку решить: Выбрать из каждой символьной строки исходного массива только те символы, которые встречаются в ней более одного раза и сформировать результирующий массив, не включая строки, в которых не оказалось повторяющихся символов. (пробелы не учитывать). Я сам пробовал но пока безрезультатно…
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
13.02.2009, 18:47 |
11 |
molodoi programmist 2 / 2 / 0 Регистрация: 06.02.2009 Сообщений: 24 |
||||
13.02.2009, 20:14 |
2 |
|||
это примерно так выглядит!! не магу проверить паскаля нету
0 |
0 / 0 / 0 Регистрация: 13.02.2009 Сообщений: 10 |
|
14.02.2009, 16:46 [ТС] |
3 |
Вот путем долгих мучений составил алгоритм: 1.Вводим массив строк. Помогите код написать, или блок-схему хотябы…
0 |
Puporev Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
14.02.2009, 21:32 |
4 |
|||
-берём первый символ строки и сравниваем его с остальными Потом Вы этот символ еще как минимум 1 раз найдете, и снова будете выводить? Добавлено через 52 минуты 56 секунд
0 |
0 / 0 / 0 Регистрация: 13.02.2009 Сообщений: 10 |
|
14.02.2009, 21:49 [ТС] |
5 |
а вы правы….. Добавлено через 16 минут 58 секунд
0 |
0 / 0 / 0 Регистрация: 13.02.2009 Сообщений: 10 |
|
22.02.2009, 17:30 [ТС] |
6 |
Товарищи, помогите блок схему начертить…а то запутался в циклах..
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
22.02.2009, 17:33 |
7 |
Скачай FCEditor. Он тебе нарисует правильную по сути схему. Потом перерисуешь как надо.
0 |
45 / 43 / 3 Регистрация: 08.01.2009 Сообщений: 306 |
|
22.02.2009, 20:48 |
8 |
Puporev, что можете ещё посоветовать из подобных полезных программ ????
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
22.02.2009, 20:53 |
9 |
Из доступных, в смысле бесплатных(с учетом некоторых усовершенствований) самая лучшая. Рисует не по ГОСТу, но правильно алгоритмически, в отличие от других похожих. Есть еще BlokShema, но там из готовых фигурок надо самому схему компановать, долго и все равно уметь надо.
0 |
0 / 0 / 0 Регистрация: 13.02.2009 Сообщений: 10 |
|
22.02.2009, 20:55 [ТС] |
10 |
Puporev, спасибо большое!
0 |
45 / 43 / 3 Регистрация: 08.01.2009 Сообщений: 306 |
|
22.02.2009, 20:57 |
11 |
…FCEditor… А эта программа, сам что ли рисует по существующему коду????
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
22.02.2009, 21:19 |
12 |
Да, сама, причем алгоритмически верно, потом только перерисовать как у вас требуется.
0 |
uses crt; const nmax=20; var m1,m2:array[1..nmax]of string; n,i,j,k,p,l:byte; mn:set of char; begin clrscr; writeln('Vvedite stroki simvolov, okoncanie vvoda *'); n:=0; repeat inc(n); write('Stroka ',n,': '); readln(m1[n]); until (m1[n]='*')or (n=nmax); writeln; writeln('Simvoly > 1 raza:'); p:=0; for i:=1 to n do {идем по массиву} begin while pos(' ',m1[i])>0 do {пока в текущей строке есть пробелы} delete(m1[i],pos(' ',m1[i]),1);{удаляем из нее пробелы} write('stroka ',i,': '); k:=0;mn:=[];{счетчик совпадений символа=0, множество символов пустое} for j:=1 to length(m1[i])-1 do{идем по очередной строке} for l:=j+1 to length(m1[i]) do{по ее "клону" со следующего символа} if (m1[i][j]=m1[i][l])and not(m1[i][j] in mn) then{если символ совпал и его еще нет в множестве} begin k:=1;{фиксируем} write(m1[i][j],' ');{выводим в строку} mn:=mn+[m1[i][j]];{включаем в множество} end; if k=0 then write('Takih simvolov net!'){если нет таких, сообщаем} else if k=1 then{если есть} begin inc(p);{увеличиваем счетчик нового массива} m2[p]:=m1[i];{заносим в него строку} end; writeln; end; Writeln('Massiv m2:');{} for i:=1 to p do writeln(m2[i]); readln end.
Перейти к содержанию
Удаление из строки повторяющихся символов
Просмотров 6.4к. Обновлено 15 октября 2021
Вводится строка. Требуется удалить из нее повторяющиеся символы и все пробелы. Например, если было введено «abc cde def», то должно быть выведено «abcdef».
Проще всего задачу решить, если формировать результирующую строку в другой переменной, а не изменять значение переменной, которой была присвоена введенная строка.
Извлекать каждый символ введенной строки. Если он не встречается в новой строке и не является пробелом, то добавлять его в конец новой строки.
Pascal
var
s1,s2: string;
c: char;
i: byte;
begin
readln(s1);
s2 := '';
for i:=1 to length(s1) do begin
c := s1[i];
if (pos(c,s2) = 0) and (c <> ' ') then
s2 := s2 + c
end;
writeln(s2);
end.
abc cde def
abcdef
Язык Си
#include < string.h>
main() {
char s[100], s_new[100];
char c, i, j;
gets(s);
j = 0;
for (i=0; i< strlen(s); i++) {
c = s[i];
if (strchr(s_new,c) == NULL && c != ' ') {
s_new[j] = c;
j += 1;
}
}
s_new[j] = '';
puts(s_new);
}
cpu gpu mb cooler
cpugmboler
Python
удалить повторяющиеся символы в строке python
# Вариант 1s = input()
s_new = ''
for i in range(len(s)):
if s_new.find(s[i]) == -1 and s[i] != ' ':
s_new += s[i]
print(s_new)# Вариант 2
s = input()
s_new = ''for i in s:
if i not in s_new and i != ' ':
s_new += iprint(s_new)
a a b d c a c k l c d f
abdcklf
Basic-256
input s$
s_new$ = mid(s$,1,1)
for i=2 to length(s$)
a$ = mid(s$,i,1)
if instr(s_new$,a$) = 0 and a$ <> " " then
s_new$ = s_new$ + a$
endif
next i
print s_new$
Если изначально s_new$ присвоить пустую строку, то вызов функции instr() вызывает ошибку.
Этот код должен считать кол-во вхождений буквы а
в коде, но у меня не получается правильно написать этот алгоритм, я знаю в чем ошибка, но не знаю как это исправить.
Program hackerman228;
begin;
var line:string;
var countA, countB, i:integer;
write('Введите предложение: ');
read(line);
for i:=0 to line.Length-1 do
begin
if (pos('а', copy(line, i+1, line.Length - i -1)) > 0) then
begin
countA:= countA + 1;
end;
end;
write('Кол-во слов начинающихся на букву а: ', countA);
end.
Viktor Tomilov
7,9974 золотых знака24 серебряных знака61 бронзовый знак
задан 19 ноя 2018 в 21:09
uzi_no_uziuzi_no_uzi
2,1862 золотых знака17 серебряных знаков45 бронзовых знаков
3
Замысловатый метод, но так и быть:
if Pos('а', Copy(line, i + 1, 1)) = 1 then
if 'а' = line[i + 1] then
ответ дан 19 ноя 2018 в 21:11
1
Инициализацию Var вытащи за пределы Begin:
var line:string;
countA, countB, i:integer;
Begin....
ответ дан 21 дек 2018 в 7:47
DmitryDmitry
112 бронзовых знака
Знакомство с понятием регулярного выражения. Работа со строками и регулярными выражениями в Паскаль abc.net
Содержание:
- Символы
- Строки
- Язык регулярных выражений
- Файлы
- Решение задач
Символы
begin var c: char; c:='a'; Println(c.IsDigit); // число ли - False Println(c.IsLetter); // буква ли - True Println(c.IsLower); // строчная ли - True Println(c.IsUpper); // прописная ли - False end.
Строки
begin var s: string; s:='Abc'; Println(s.ToLower); // abc Println(s.ToUpper); // ABC end.
Срезы для строк:
begin var s: string; s:='12345678'; Println(s[3:6]); // 345 Println(s[::-1]); // 87654321 end.
Методы:
Преобразования строка <-> число:
begin var s: string; s:='12345678'; var i:=1; Println(i.ToString); // строка '1' Println(s.ToInteger); // число 12345678 Println(s.ToReal); // число 12345678 end.
ИЛИ
begin var s: string; s:='12345678'; var i:=1; Println(integer.TryParse(s,i)); // можно ли преобразовать строку s в число - True end.
Преобразование строки в массив слов:
begin var s:='каждый охотник желает знать, где сидит фазан'; var ss:=s.ToWords.Println; // каждый охотник желает знать, где сидит фазан ss.Sorted.Println // где желает знать, каждый охотник сидит фазан end.
Добавляем разделитель:
begin var s:='каждый охотник желает знать, где сидит фазан'; var ss:=s.ToWords.Println; // каждый охотник желает знать, где сидит фазан ss.JoinIntoString('!').Println // каждый!охотник!желает!знать,!где!сидит!фазан end.
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
Пример: удалить все буквы «ж«:
begin var s:='каждый охотник желает знать, где сидит фазан'; s:=s.Where(c -> c<>'ж').JoinIntoString; print(s); // кадый охотник елает знать, где сидит фазан end.
При работе со строками можно использовать любой метод последовательности
Язык регулярных выражений
Язык регулярных выражений — это язык шаблонов, расширенные операции поиска и замены для строк.
Основной цикл:
s := 'red green gray blue'; foreach var m in s.Matches('w+') do Print(m.Value, m.Index);
Т.е. m: Match
включает m.Value
, m.Index
Опции регулярных выражений:
s := 'AБракадабРА'; s.Matches('бра', RegexOptions.IgnoreCase)
Примеры регулярных выражений:
‘кот|кит’ ‘к[ио]т’ ‘к[а-я]т’ ‘ко+т’ ‘кор?т’ ‘к.т’ ‘к.т’ ‘к.*т’
‘ко{3}т’ ‘ко{2,4}т’ ‘ко[^ъыь]т’ ‘b котb’
Управляющие символы и их запись в регулярных выражениях:
* + ? | { [ ( ) ^ $ . #
Они экранируются дополнительным
Квантификаторы:
*
— 0 или более повторений
+
— 1 или более повторений
?
— 0 или 1 повторение
{N}
— ровно N повторений
{N,}
— не менее N повторений
{N,M}
— от N до M повторений
Директивы нулевой длины:
^
— начало строки
$
— конец строки
b
— позиция на границе слова
Классы символов:
[abcd]
— один из символов, указанных в списке
[^abcd]
— любой из символов, кроме тех, которые указаны в списке
[a-d]
— один из символов, лежащих в указанном диапазоне
[^a-d]
— любой из символов, кроме тех, которые лежат в указанном диапазоне
d
— десятичная цифра: [0-9]
D
— любой символ, кроме десятичной цифры
w
— буква, цифра или символ подчеркивания
W
— любой символ, не являющийся словообразующим;
s
— пробельный символ, т. е. [ trn];
S
— любой непробельный символ;
.
— любой символ
Группы:
s := ' prepod@sfedu.ru prepod2@sfedu.ru '; foreach var m in s.Matches('(w+)@(w+).(w+)') do Println(m.Groups[0], m.Groups[1], m.Groups[2], m.Groups[3]); s.Matches('(т[оае])1*')
Замена с помощью регулярного выражения:
s.Replace('bw+b', '<$0>') s := s.Replace('w+',m->m.Value.ToUpper); s := s.Replace('w+',m->m.Value+'('+m.Length+')') s := '10+2=12'; s.Replace('d+', '<$0>') // <10>+<2>=<12> s.Replace('d+', m -> (m.Value.ToInteger*2).ToString) // 20+4=24 s := ' prepod@sfedu.ru prepod2@sfedu.ru '; s.Replace('(w+)@(w+).(w+)', '$1-$2-$3')
Файлы
- текстовые файлы
: Text
- типизированные файлы
: file of ...
- бестиповые (двоичные файлы)
: file
Прежний стиль работы:
var f:file of integer; begin reset(f,'a.dat'); write(f,1,3); read (f,x,y); close(f);
Новый стиль работы:
var f:=OpenFile&<integer>('a.dat'); f.Wriet(1,3); Read(f,x,y); Close(f);
Символ &
необходим для снятия значения операции меньше <
Файл из элементов одного типа можно воспринимать, как последовательность:
ReadElements&<integer>('a.dat'); ... foreach var i in ReadElements&<integer>('a.dat') do ...
Для текстовых файлов:
var f:=OpenRead('a.txt'); var f:=OpenWrite('a.txt'); f.ReadLnString while not f.EOF do begin var s:=f.ReadLnString; Print(s) end; f.close;
ReadLines('a.txt')
— открытие на чтение, значения — последовательность строк.
Можно выполнять функции последовательностей:
ReadLines(‘a.txt’).Skip(1);
Решение задач
?Пример 1: Вывести все слова из файла.
Выполнение:
begin var a:=ReadLines('in.txt'); //var a:='dfgdg argag asfa tyru'; foreach var w in a do begin var ww:=w.Matches('w+'); writeln(ww); end; end.
Пример 2: Вывести все слова длиной в 3 символа
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('bw{3}b'); ww.Println; end; end.
Пример 3: Вывести все слова, длина которых составляет 3,4 или 5 символов
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('bw{3,5}b'); ww.Println; end; end.
Пример 4: Вывести все слова, начинающиеся на ‘с
‘ и заканчивающиеся на ‘а
‘. Проверьте, что не выводятся подстроки.
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('bсw+аb'); ww.Println; end; end.
Пример 5: Вывести все числа
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('d'); ww.Println; end; end.
Пример 6: Вывести все слова, в которых первый и последний символы совпадают. Учесть однобуквенные.
Выполнение:
Пример 7: Замените все даты в американском формате (с .
или /
) на привычный формат с .
в качестве разделителя и номером дня недели первым
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Replace('(d{1,2})[./](d{1,2})[./](d{2,4})','$2.$1.$3'); ww.Println; end; end.
Пример 8: Найдите числа с запятой или пробелом, в качестве разделителя разрядов
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('bd+[, ]d+b'); ww.Println; end; end.
Пример 9: Выделить тегом strong
повторяющиеся подряд слова. (например, «все все — все <strong
>все</strong
>»)
Выполнение:
Пример 10: Преобразовать текст, обрамленный в две звездочки (**
), в полужирное начертание (тег bold
)
Выполнение:
begin var a:=ReadLines('inMD.txt'); foreach var w in a do begin var ww:=w.Replace('**(bw+b)**','<bold>$1<bold>'); ww.Println; end; end.
Пример 11: Выбрать IPv4 адреса
Выполнение:
begin var a:=ReadLines('in.txt'); foreach var w in a do begin var ww:=w.Matches('bd{1,3}.d{1,3}.d{1,3}.d{1,3}b'); ww.Println; end; end.
Пример 12: Напишите преобразование обозначений MarkDown в соответствующие теги htlm
Выполнение: