Как найти повторяющиеся буквы в паскале

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

это примерно так выглядит!! не магу проверить паскаля нету

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uses crt;
var s:string;
a:array[1..10] of char
i,j:byte;
begin
writeln ('Vvedite predlogenie');
readln (s);
for j:=65 to 122 do
begin
if s[i]:=' ' then i:=i+1;
for i:=1 to length (s) do
if s[i]:=chr(j) then a[i]:=s[i]+a[i];
end;
for i:=1 to length (s) do
wrie (a[i]:3,'   ':2);
end.



0



0 / 0 / 0

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

Сообщений: 10

14.02.2009, 16:46

 [ТС]

3

Вот путем долгих мучений составил алгоритм:

1.Вводим массив строк.
2.Работаем с первой строкой:
-Удаляем из неё все пробелы
-берём первый символ строки и сравниваем его с остальными
-если находится хоть один такой же символ, то этот символ записывается в результирующий массив символов
-если не находит одинаковых, то переходим ко второму символу этой строки, и выполняем поиск снова.
3.Переходим на вторую(следующую строку) и выполняем пункт (2).
4.Выводим на экран результирующий массив знаков.

Помогите код написать, или блок-схему хотябы…



0



Puporev

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

64287 / 47586 / 32739

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

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

14.02.2009, 21:32

4

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

Потом Вы этот символ еще как минимум 1 раз найдете, и снова будете выводить?

Добавлено через 52 минуты 56 секунд
Вот код практически по твоему алгоритму, только множество добавил, в ответ на свой вопрос.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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.



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

Цитата
Сообщение от Puporev
Посмотреть сообщение

…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


# Вариант 1

s = 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 += i

print(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's user avatar

Viktor Tomilov

7,9974 золотых знака24 серебряных знака61 бронзовый знак

задан 19 ноя 2018 в 21:09

uzi_no_uzi's user avatar

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

Dmitry's user avatar

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

    Выполнение:

    Понравилась статья? Поделить с друзьями:
  • Как найти легендарного койота в rdr 2
  • Как найти хорошую игру в роблоксе
  • Как можно найти изображение по картинке
  • Как вернуть парня если он нашел другую
  • Как найти все ярлыки на диске